El control DataGrid
puede conectar con bases de datos, como se ha visto, pero también puede leer
los datos desde un archivo XML, de texto plano y fácilmente accesible
desde cualquier editor de texto o navegador de Internet, con las
ventajas que éso conlleva frente a formatos propietarios de bases de datos.
Almacenar datos en formato XML tiene algunas ventajas
destacadas:
no dependemos de etiquetas preestablecidas, como sucede
con HTML, sino que podemos crear nuestras propias etiquetas
y, si el archivo cumple el estándar XML, serán reconocidas.
como el formato XML se basa en texto plano,
se evita la necesidad de tener instalados los programas que entienden formatos
específicos de bases de datos. XML es fácilmente portable entre almacenes
de datos diferentes y distintas plataformas.
al tratarse de texto plano, es capaz de penetrar los cortafuegos , evitando problemas de seguridad que aparecen al abrir paso a otros tipos de archivos capaces de causar daños.
Ordenar el DataGrid
Es posible configurar maneras diferentes de ordenar los registros del DataGrid , pero la más sencilla de ellas es aprovechar propiedades y métodos del propio control para que los títulos de las columnas se convierten en hipervínculos que, al ser pulsados, ordenen los registros en base al nombre del campo que muestra esa columna.
Los pasos para conseguir ordenar el DataGrid al pulsar en el título de la columna son poco complejos pero es necesario remarcarlos:
En la etiqueta asp:DataGrid
hay que definir las claves AllowSorting= "True"
y OnSortCommand="ordenarGrid".
<asp:DataGrid
AllowSorting="True"
OnSortCommand="ordenarGrid">
En las columnas enlazadas con los campos de la tabla se
define la propiedad SortExpression="valor"
donde valor es una cadena con el nombre del campo. La propiedad
DataGridColumn.SortExpression obtiene
o establece el nombre del campo o expresión que se va a pasar al método
OnSortCommand cuando se selecciona una
columna para ordenarla.
<asp:TemplateColumn
HeaderText="Nombre"
SortExpression="Nombre">
<HeaderStyle horizontalalign="Center"></HeaderStyle>
<ItemTemplate>
<asp:TextBox id="Nombre"
runat="server"
text='<%#
Container.DataItem("Nombre")
%>' />
</ItemTemplate>
</asp:TemplateColumn>
Si se habilita la ordenación, se procesan los controles
LinkButton en la sección de encabezado
de cada columna donde está establecida la propiedad
SortExpression. Los controles
LinkButton aceptan pulsaciones como
hipervínculos.
Cuando se hace clic en un control
LinkButton de una columna, se provoca el evento
SortCommand. El valor de
SortExpression de la columna seleccionada
se pasa al controlador de eventos OnSortCommand
como parte del objeto DataGridSortCommandEventArgs.
El método ordenarGrid
asociado al evento OnSortCommand ha
de ser desarrollado en el código Visual Basic.
Sub ordenarGrid(sender
As Object, e
As DataGridSortCommandEventArgs)
'Crear un DataView para presentar los datos ordenados.
'DataView permite personalizar las vistas de una tabla.
'DataView lee la tabla, ordena los registros con arreglo
'a la propiedad SortExpression del objeto DataGridSortCommandEventArgs
'y los muestra con esa vista, después se enlaza de nuevo el DataGrid
'al origen de los datos
Dim dt As DataTable =
New DataTable
'Generar una instancia de DataSet
Dim dsDatos2
As DataSet = dsDatos()
dt = dsDatos2.Tables(0)
Dim dv As
DataView = New DataView(dt)
dv.Sort = e.SortExpression
Rejilla.DataSource = dv
Rejilla.DataBind()
End Sub
Modificar
el DataGrid Para que el usuario pueda modificar los datos
del DataGrid mientras está conectado a ellos, tenemos 2 maneras principales
de hacerlo:
usar BoundColumn que, por defecto, es el único tipo
de columna capaz de cambiar a campos modificables. El otro tipo de columna
usada para contener registros en el DataGrid es TemplateColumn,
que mantiene su aspecto original. Con este método se pierde control al interpretar
los campos de la tabla (ej: los cuadros de texto pueden ser mucho más largos
que la celda que los contiene).
usar cuadros de texto (asp:TextBox ) dentro de elementos EditItemTemplate incluidos en columnas TemplateColumn. De esta manera hay menos eventos que vigilar y se tiene mayor control sobre las características del DataGrid .
En este ejercicio se ha elegido la segunda manera:
<asp:TemplateColumn HeaderText="Nombre">
<HeaderStyle Width="300px" HorizontalAlign="Left"></HeaderStyle>
<ItemTemplate>
<%# Container.DataItem("Nombre") %>
</ItemTemplate>
<EditItemTemplate>
<asp:TextBox id="txtNombre" Width="295px"
Text='<%# Container.DataItem("Nombre")%>' runat="server" />
</EditItemTemplate>
</asp:TemplateColumn>
Las columnas del DataGrid que contienen los enlaces a los métodos de edición de registros son diferentes, en este ejercicio se han empleado asp:LinkButton en las que se definen los comandos Edit, Delete, Cancel y Update:
<asp:TemplateColumn>
<ItemTemplate>
<asp:LinkButton CommandName="Edit" Text="Editar" runat="server" ID="btEdit" />
<asp:LinkButton CommandName="Delete" Text="Borrar" runat="server" ID="btDelete" />
</ItemTemplate>
<EditItemTemplate>
<asp:LinkButton CommandName="Cancel" Text="Cancelar" runat="server" ID="btCancel" />
<asp:LinkButton CommandName="Update" Text="Actualizar" runat=server" ID="btUpdate" />
</EditItemTemplate>
</asp:TemplateColumn>
El nombre de los métodos que se ejecutarán en cada uno de estos comandos se define en la etiqueta asp:DataGrid
<asp:DataGrid OnDeleteCommand="cmDelete" OnCancelCommand="cmCancel" OnUpdateCommand="cmUpdate" OnEditCommand="cmEdit">
Después hay que definir en el código Visual Basic cada uno de estos métodos, como ejemplo, vemos el que activa el modo de edición cmEdit:
'Procedimiento al pulsar el botón EDITAR del control DataGrid
'Este controlador para el evento cmEdit (evento del tipo EditCommand)
'establece la propiedad EditItemIndex en la fila seleccionada
Sub cmEdit(ByVal Sender As Object, ByVal e As DataGridCommandEventArgs)
'Editar el elemento cuyo índice coincide con el de la fila elegida
rejilla.EditItemIndex = CInt(e.Item.ItemIndex)
'Enlazar de nuevo los datos al control DataGrid
rejilla.DataSource = dsDatos()
rejilla.DataBind()
End Sub
O el que activa el modo de edición cmDelete :
'Procedimiento al pulsar el botón BORRAR
Sub cmDelete(Sender As Object, e As DataGridCommandEventArgs)
'Generar una instancia de DataSet
Dim dsDatos2 As DataSet = dsDatos()
'Entero que contiene el índice de la fila seleccionada
Dim fila As Integer = CInt(e.Item.ItemIndex)
'Eliminar la fila seleccionada
dsDatos2.Tables(0).Rows(fila).Delete()
'Escribir el contenido del DataSet en el archivo XML
dsDatos2.WriteXml(Server.MapPath("../datos/agenda2.xml"))
'Quitar el modo de edición a la fila seleccionada:
'EditItemIndex igual a -1 desactiva el modo de edición
rejilla.EditItemIndex = -1
'Enlazar de nuevo los datos al control DataGrid
rejilla.DataSource = dsDatos()
rejilla.DataBind()
End Sub
Problemas de seguridad al generar la página aspx
Si al generar la página dinámica
aspx aparece un error de compilación relacionado con un mensaje del tipo:
"Exception Details: System.UnauthorizedAccessException: El acceso a la ruta
"ruta_al_archivo_xml" ha sido denegado. Asp .NET no está autorizado a acceder
al recurso solicitado..." posiblemente la carpeta en que se encuentra el
archivo XML no tenga concedidos por IIS permisos de escritura (se soluciona
fácilmente configurando los permisos de IIS con la herramienta
%SystemRoot%\System32\Inetsrv\iis.msc
y añadiendo permisos de escritura a ese directorio haciendo clic con
el botón derecho sobre él y entrando en la pestaña Directorio).
Si con ello el error no desaparece, entonces lo más probable sea que la carpeta
que contiene el archivo XML no tenga, entre los grupos de usuarios que
tienen permiso para acceder a ella, el grupo Nombre_de_máquina/ASP .NET
(ASP.NET Machine Account) o, en caso de tenerlo, este grupo ASP .NET
no tenga concedidos los permisos adecuados de modificación y escritura, en cualquiera
de los 2 casos hay que entrar en la configuración de seguridad de la carpeta
(clic con el botón derecho sobre la carpeta, elegir Propiedades y seleccionar
la pestaña Seguridad para añadir o modificar el grupo apropiado, remarcar
la cuenta ASP .NET y marcar las casillas de verificación deseadas).
Para los usuarios de Windows XP Home, conviene recordar que la pestaña
Seguridad de las carpetas y archivos sólo está disponible si se entra
en el sistema en modo seguro, para ello hay que pulsar F8 justo
antes de que se inicie el arranque de Windows y elegir Modo seguro en
el menú que se muesta en pantalla.
NOTA: Para que el código de la aplicación sea más legible, se ha separado en 2 archivos, la página aspx contiene el código HTML - Asp.NET y un archivo externo vb contiene el código Visual Basic (código de apoyo).