Archivo XML como origen de datos de un DataGrid
editable Fecha: 20/02/2004 (20/Feb/2004) |
. |
XML y Asp .NETEl 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).
- 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 (de aqu� viene lo de eXtensible).
- 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.
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:
- 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. As� se realiza en este ejercicio:
<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 SubO 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 SubProblemas 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�
Fichero con el c�digo de ejemplo (miliuco_datagridxml.zip - Tama�o 4.16 KB)