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 ([email protected])

 
.

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)