Archivo XML como origen de datos de un DataGrid editable
[DataGrid que se rellena desde un archivo XML, se modifican los registros y los cambios se guardan en el archivo XML ]

Fecha: 20/02/2004 (20/Feb/2004)
Actualizado: 22/Feb/2004
Autor: Emilio Pérez Egido (seldon@miliuco.net)

 
.

XML y Asp .NET

El control DataGrid de Asp .NET puede rellenarse a partir de bases de datos, gracias a la tecnología Ado .NET que permite que una aplicación acceda a los datos en modo desconectado. Pero el DataGrid de Asp .NET también puede leer los datos desde un archivo XML, que es 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 (Microsoft Access, SQLServer, Oracle, etc.).

XML (eXtensible Markup Language - Lenguaje Extensible de Etiquetado) nació para ser un lenguaje universal apto para representar datos en la red Internet. Está basado en texto y su finalidad es la descripción de datos, utilizando etiquetas simples para describir el contenido. Se trata, en suma, de una manera sencilla y potente de transportar datos a distinos lugares. Almacenar datos en formato XML tiene algunas ventajas destacadas:

Asp .NET permite acceder fácilmente a documentos XML. El espacio de nombres System.Xml contiene clases para acceder a XML de una manera muy similar al acceso a una base de datos con Ado .NET. Sobre todo nos interesan 2 objetos, XMLTextReader (para acceder de forma rápida y sencilla al contenido de un archivo XML, es similar al OleDbDataReader pues proporciona un método de lectura sólo hacia delante) y XmlTextWriter (para escribir archivos XML).
Pero haciendo que el DataGrid se rellene a partir de un DataSet, que actúa como conjunto de datos, y recurriendo a los métodos ReadXml() y WriteXml() del control DataSet, es posible realizar la lectura y escritura de documentos XML sin necesidad de importar el espacio de nombres System.Xml (ésta es la vía elegida para este ejercicio):

'Cadena con la ruta al archivo XML
Dim sourceXML As String = Server.MapPath("miliuco_datagridxml.xml")
'Generar una instancia de DataSet
Dim dsDatos As DataSet = New DataSet
'Rellenar el DataSet desde el archivo XML
dsDatos.ReadXml(sourceXML)
'Escribir el contenido del DataSet en el archivo XML
dsDatos.WriteXml(sourceXML)

Edición de registros en el DataGrid

Por otro lado, tenemos la posibilidad de crear DataGrid estáticos cuyos datos sólo pueden ser leídos pero, cuando necesitemos que el usuario pueda modificar los datos mientras está conectado a ellos, hay que dotar al dataGrid de la posibilidad de ser editado para aceptar y guardar los cambios realizados. Existen 2 maneras principales de hacerlo:

<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, aquí 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(sourceXML)
    '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).

Para generar la página aspx, pulsa aquí


ir al índice

Fichero con el código de ejemplo (miliuco_datagridxml.zip - Tamaño 4.16 KB)