0% encontró este documento útil (0 votos)
575 vistas27 páginas

Guía de DataGrid en VB.NET con ADO.NET

Este documento describe las características y uso del control DataGrid en Visual Basic .NET para enlazar datos con ADO.NET. Explica cómo crear un DataGrid de forma programática y mediante asistentes, y cómo configurar sus propiedades para modificar su apariencia y comportamiento. También cubre la creación y configuración de objetos que permiten personalizar las propiedades de las columnas y filas del DataGrid.

Cargado por

Sergio Sanchez
Derechos de autor
© Attribution Non-Commercial (BY-NC)
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como DOC, PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
575 vistas27 páginas

Guía de DataGrid en VB.NET con ADO.NET

Este documento describe las características y uso del control DataGrid en Visual Basic .NET para enlazar datos con ADO.NET. Explica cómo crear un DataGrid de forma programática y mediante asistentes, y cómo configurar sus propiedades para modificar su apariencia y comportamiento. También cubre la creación y configuración de objetos que permiten personalizar las propiedades de las columnas y filas del DataGrid.

Cargado por

Sergio Sanchez
Derechos de autor
© Attribution Non-Commercial (BY-NC)
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como DOC, PDF, TXT o lee en línea desde Scribd

[VISUAL BASIC.

NET CON BASE DE DATOS] IDSYSTEMS 2013

DataGrid
Este control, del que ya realizamos una pequea demostracin en un apartado anterior, nos va a permitir realizar enlace complejo de datos con ADO .NET. Se trata de la versin mejorada del control DataGrid de ADO, disponible en Visual Basic 6, pero con una serie de funcionalidades optimizadas, y otras nuevas aadidas. Para utilizar algunas de sus caractersticas, crearemos un proyecto de prueba con el nombre DataGridPru (hacer clic aqu para acceder a este ejemplo), consistente en un formulario MDI, con una serie de opciones de men, a travs de las cuales, mostraremos diversas caractersticas de este control, y algunas otras adicionales sobre ADO .NET. La opcin de men DataGrid + Normal, mostrar el formulario frmNormal, que contiene un sencillo DataGrid con una tabla. Podemos editar los registros de la tabla y aadir nuevos; al trabajar en desconexin, hasta que no pulsemos el botn Actualizar de este formulario, el objeto DataAdapter del mismo no actualizar los datos del DataSet hacia la base de datos fsica. Otra caracterstica incluida por defecto es la ordenacin de las filas por columna al hacer clic en su ttulo. Finalmente, al redimensionar el formulario, tambin cambiar el tamao del DataGrid, puesto que hemos utilizado su propiedad Anchor para anclarlo a todos los bordes de la ventana. La Figura 350 muestra este formulario.

Figura 350. DataGrid editable.

El Cdigo fuente 582 muestra el cdigo principal de este formulario. Recordamos al lector, la necesidad de crear un objeto CommandBuilder para el DataAdapter, ya que en caso contrario, al intentar actualizar el DataSet contra la base de datos, se producir un error.

Private oDataAdapter As SqlDataAdapter Private oDataSet As DataSet

LECCION 7 El control DataGrid

Pgina 1

[VISUAL BASIC.NET CON BASE DE DATOS] IDSYSTEMS 2013


Private Sub frmNormal_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Load Private Sub frmNormal_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Load ' crear conexin Dim oConexion As New SqlConnection() oConexion.ConnectionString = "Server=(local);" & _ "Database=Musica;uid=sa;pwd=;" ' crear adaptador oDataAdapter = New SqlDataAdapter("SELECT * FROM Grabaciones", oConexion) ' crear commandbuilder Dim oCB As SqlCommandBuilder = New SqlCommandBuilder(oDataAdapter) ' crear dataset oDataSet = New DataSet() oDataAdapter.Fill(oDataSet, "Grabaciones") ' asignar dataset al datagrid Me.grdDatos.DataSource = oDataSet Me.grdDatos.DataMember = "Grabaciones" End Sub Private Sub btnActualizar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnActualizar.Click Me.oDataAdapter.Update(oDataSet, "Grabaciones") End Sub Cdigo fuente 582

Creacin de un DataGrid a travs de los asistentes del IDE


El modo ms potente de crear un DataGrid es a travs de cdigo, ya que nos permite un mayor grado de manipulacin de sus propiedades. Sin embargo, para aquellas ocasiones en que necesitemos una vista rpida de los datos en un formulario para pruebas o similares, podemos utilizar los asistentes de Visual Studio .NET, en lo que a creacin de conexiones, adaptadores, DataGrid, etc., se refiere. Vamos a crear por lo tanto un nuevo formulario para el proyecto con el nombre frmGridAsist. Una vez aadido el diseador, abriremos la pestaa Explorador de servidores, y haciendo clic derecho en su elemento Conexiones de datos, nos mostrar la ventana para la creacin de una nueva conexin con una base de datos, en este caso de un servidor SQL Server; en ella introduciremos los valores necesarios para la conexin. Ver Figura 351.

LECCION 7 El control DataGrid

Pgina 2

[VISUAL BASIC.NET CON BASE DE DATOS] IDSYSTEMS 2013

Figura 351. Creacin de una conexin desde el Explorador de servidores.

En el siguiente paso, abriremos el Cuadro de herramientas, y pulsaremos la ficha Data, aadiendo al formulario un control SqlDataAdapter, lo que abrir un asistente para la configuracin de este control. Ver Figura 352. Tras la ventana de presentacin, al pulsar el botn Siguiente, deberemos elegir la conexin que el adaptador utilizar. Ver Figura 353.

LECCION 7 El control DataGrid

Pgina 3

[VISUAL BASIC.NET CON BASE DE DATOS] IDSYSTEMS 2013

Figura 352. Asistente para configuracin del control SqlDataAdapter.

Figura 353. Seleccin de la conexin de datos.

LECCION 7 El control DataGrid

Pgina 4

[VISUAL BASIC.NET CON BASE DE DATOS] IDSYSTEMS 2013

A continuacin seleccionaremos el tipo de consulta, en este caso una sencilla sentencia SQL. Ver Figura 354.

Figura 354. Seleccin del tipo de consulta que contendr el adaptador.

Continuaremos con la escritura de la sentencia SQL que quedar incluida en el DataAdapter. Ver Figura 355.

LECCION 7 El control DataGrid

Pgina 5

[VISUAL BASIC.NET CON BASE DE DATOS] IDSYSTEMS 2013

Figura 355. Escritura de la consulta SQL a generar.

Como paso final, se muestra un resumen de lo que este asistente ha generado en el DataAdapter. Figura 356.

LECCION 7 El control DataGrid

Pgina 6

[VISUAL BASIC.NET CON BASE DE DATOS] IDSYSTEMS 2013

Figura 356. Resultados del asistente de generacin del DataAdapter.

Finalizada la creacin del adaptador de datos, seleccionaremos el men Datos + Generar conjunto de datos del IDE, que nos mostrar una ventana en la que daremos el nombre del DataSet que utilizar el formulario, y nos permitir elegir las tablas que contendr. Ver Figura 357.

Figura 357. Creacin del DataSet.

LECCION 7 El control DataGrid

Pgina 7

[VISUAL BASIC.NET CON BASE DE DATOS] IDSYSTEMS 2013

A continuacin dibujaremos un DataGrid en el formulario, y pasaremos a su ventana de propiedades. En la propiedad DataSource asignaremos el DataSet que acabamos de crear, mientras que en la propiedad DataMember, seleccionaremos la tabla del DataSet que va a mostrar el DataGrid. Ver Figura 358.

Figura 358. Propiedades del DataGrid para la obtencin de datos.

Completado este ltimo paso, el DataGrid mostrar en tiempo de diseo, la disposicin de las columnas de la tabla en su interior. Ver Figura 359.

Figura 359. DataGrid mostrando informacin de las columnas de la tabla del DataSet.

En cuanto al cdigo que debemos escribir, en el evento Load, inicializaremos el DataSet, rellenndolo a continuacin mediante el DataAdapter. Ver Cdigo fuente 583.

Private Sub frmGridAsist_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Load Me.DsMusica1.Clear() Me.SqlDataAdapter1.Fill(Me.DsMusica1) End Sub Cdigo fuente 583

Podremos ver este formulario en ejecucin al seleccionar en el formulario principal del ejemplo, el men DataGrid + Asistente.

LECCION 7 El control DataGrid

Pgina 8

[VISUAL BASIC.NET CON BASE DE DATOS] IDSYSTEMS 2013

Configurar las propiedades del DataGrid


En los casos anteriores, hemos creado un formulario con un DataGrid que tena la apariencia visual por defecto de este control. Evidentemente, a travs de las propiedades del DataGrid, tanto en diseo como en ejecucin, podemos de un modo muy flexible y potente, cambiar la apariencia y el comportamiento de este control. En el formulario frmGridProp, mostramos la misma informacin que en el anterior ejemplo, pero con una presentacin totalmente distinta, al modificar algunas propiedades del DataGrid como BackColor, AlternatingBackColor, CaptionText, etc. Abriremos este formulario con la opcin DataGrid + Propiedades, de la ventana MDI del proyecto. Ver Figura 360.

Figura 360. DataGrid con propiedades modificadas.

Configurar por cdigo las propiedades del DataGrid


Supongamos ahora, que necesitamos por cdigo modificar las propiedades no slo del DataGrid en general, sino de algunas columnas del mismo. Esto es perfectamente factible mediante los objetos manipuladores de estilo, tanto del propio DataGrid, como de cada una de las columnas que lo componen. La clase DataGridTableStyle, nos permitir crear objetos que contengan una configuracin de tabla personalizada, que despus aadiremos al DataGrid. Por otra parte, mediante la clase DataGridTextBoxColumn, crearemos objetos con la configuracin particular para cada columna. La propiedad clave de estos objetos es MappingName, que contiene una cadena con el nombre de la columna de la tabla del DataSet, que ser la que muestre dicha columna. El formulario frmGridPropCod que abriremos con la opcin de men DataGrid + Prop.cdigo, hace uso en el evento de carga de la ventana, de estos objetos para variar el aspecto por defecto que tiene su DataGrid. El Cdigo fuente 584 muestra las instrucciones empleadas. LECCION 7 El control DataGrid Pgina 9

[VISUAL BASIC.NET CON BASE DE DATOS] IDSYSTEMS 2013

Private Sub frmGridPropCod_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Load

' crear conexin Dim oConexion As New SqlConnection() oConexion.ConnectionString = "Server=(local);" & _ "Database=Musica;uid=sa;pwd=;" ' crear adaptador oDataAdapter = New SqlDataAdapter("SELECT * FROM Grabaciones", oConexion) ' crear commandbuilder Dim oCB As SqlCommandBuilder = New SqlCommandBuilder(oDataAdapter) ' crear dataset oDataSet = New DataSet() oDataAdapter.Fill(oDataSet, "Grabaciones") ' asignar dataset al datagrid Me.grdDatos.DataSource = oDataSet Me.grdDatos.DataMember = "Grabaciones" ' configurar grid por cdigo Me.grdDatos.Anchor = AnchorStyles.Bottom + AnchorStyles.Left + AnchorStyles.Right + AnchorStyles.Top Me.grdDatos.CaptionText = "El listado de las grabaciones" Me.grdDatos.CaptionBackColor = Color.Turquoise Me.grdDatos.CaptionForeColor = Color.Black ' crear un objeto para estilos del datagrid Dim oEstiloGrid As New DataGridTableStyle() oEstiloGrid.MappingName = "Grabaciones" oEstiloGrid.BackColor = Color.LightGoldenrodYellow oEstiloGrid.AlternatingBackColor = Color.Aquamarine ' crear objetos de columna-grid para cada ' columna de la tabla a mostrar en el datagrid Dim oColGrid As DataGridTextBoxColumn ' configurar cada objeto de columna-grid oColGrid = New DataGridTextBoxColumn() oColGrid.TextBox.Enabled = False oColGrid.Alignment = HorizontalAlignment.Center oColGrid.HeaderText = "Descripcin grabac." ' nombre de la columna del dataset que ' se mapea hacia esta columna del grid oColGrid.MappingName = "Titulo" oColGrid.Width = 300 ' aadir la columna al objeto que contiene ' los estilos del datagrid, en concreto, ' a la coleccin de estilos de columna oEstiloGrid.GridColumnStyles.Add(oColGrid) oColGrid = Nothing oColGrid = New DataGridTextBoxColumn() oColGrid.TextBox.Enabled = False oColGrid.Alignment = HorizontalAlignment.Left oColGrid.HeaderText = "Fecha COMPRA" oColGrid.MappingName = "FCompra"

LECCION 7 El control DataGrid

Pgina 10

[VISUAL BASIC.NET CON BASE DE DATOS] IDSYSTEMS 2013


oColGrid.Width = 110 oColGrid.Format = "ddd, d-MMM-yyy" oEstiloGrid.GridColumnStyles.Add(oColGrid) oColGrid = Nothing oColGrid = New DataGridTextBoxColumn() oColGrid.TextBox.Enabled = False oColGrid.Alignment = HorizontalAlignment.Right oColGrid.HeaderText = "Valor pagado" oColGrid.MappingName = "Precio"

oColGrid.Width = 85 oColGrid.Format = "#,#" oEstiloGrid.GridColumnStyles.Add(oColGrid) oColGrid = Nothing ' una vez creadas todas las columnas de ' estilos para el grid, aadir el objeto ' que contiene el estilo personalizado ' a la coleccin de estilos de tablas ' del datagrid Me.grdDatos.TableStyles.Add(oEstiloGrid) End Sub Cdigo fuente 584

La Figura 361 muestra el resultado de esta modificacin sobre el DataGrid.

Figura 361. DataGrid modificado totalmente por cdigo.

Seleccin de tabla en el DataGrid


Al construir un DataSet, podemos utilizar distintos objetos DataAdapter para rellenarlo con diversas tablas. Como hemos visto en los anteriores ejemplos, para mostrar datos en un DataGrid, debemos asignar el DataSet a su propiedad DataSource, y el nombre de la tabla a mostrar en la propiedad DataMember. Sin LECCION 7 El control DataGrid Pgina 11

[VISUAL BASIC.NET CON BASE DE DATOS] IDSYSTEMS 2013


embargo, si obviamos la asignacin a DataMember, gracias a los mecanismos de Data Binding, el propio DataGrid, nos ofrecer la oportunidad de seleccionar la tabla a mostrar. El formulario frmGridTablas, que abrimos mediante la opcin de men DataGrid + Varias tablas del proyecto de ejemplo, dispone de este comportamiento. En su evento Load crearemos dos DataAdapter que usaremos para llenar un DataSet. Ver Cdigo fuente 585.

Private Sub frmGridTablas_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Load ' crear conexin Dim oConexion As New SqlConnection() oConexion.ConnectionString = "Server=(local);" & _

"Database=Musica;uid=sa;pwd=;" ' crear adaptadores Dim oDAAutores As New SqlDataAdapter("SELECT * FROM Autores", oConexion) Dim oDAGrabaciones As New SqlDataAdapter("SELECT * FROM Grabaciones", oConexion) ' crear dataset Dim oDataSet As New DataSet() oDAAutores.Fill(oDataSet, "Autores") oDAGrabaciones.Fill(oDataSet, "Grabaciones") ' asignar dataset a datagrid Me.grdDatos.DataSource = oDataSet End Sub Cdigo fuente 585

Como al asignar el DataSet al DataGrid no hemos indicado qu tabla queremos que muestre, el DataGrid en el formulario visualizar un nodo que al expandir, nos permitir seleccionar la tabla a mostrar. Podremos contraer dicha tabla para seleccionar otra, y as sucesivamente. Ver Figura 362.

Figura 362. Seleccin de tabla a mostrar en un DataGrid,

LECCION 7 El control DataGrid

Pgina 12

[VISUAL BASIC.NET CON BASE DE DATOS] IDSYSTEMS 2013

Relaciones entre tablas mediante objetos DataRelation


Los objetos DataRelation nos permiten establecer una relacin entre dos tablas (objetos DataTable) de un DataSet, a travs de una columna o campo comn (objetos DataColumn). Para demostrar la creacin de relaciones con estos objetos, utilizaremos el proyecto de ejemplo RelacionarDatos (hacer clic aqu para acceder a este ejemplo), en el que a travs de un formulario MDI, crearemos varios formularios hijos, cada uno con un tipo de relacin.

Obtener tablas relacionadas mediante cdigo


En primer lugar, la opcin de men Relacionar + Manual, muestra el formulario frmManual, en el que al cargar el formulario, creamos una relacin entre dos tablas, Customers y Orders, por un campo clave. Despus llenamos un ComboBox con datos de la tabla Customers.

Al seleccionar un valor del ComboBox, se tomarn las filas relacionadas de la tabla Orders y se llenar con ellas un ListBox. El cdigo necesario podemos verlo en el Cdigo fuente 586.

Private Sub frmManual_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Load ' crear conexin Dim oConexion As New SqlConnection() oConexion.ConnectionString = "server=(local);" & _ "database=Northwind;uid=sa;pwd=;" ' crear adaptadores Dim daCustomers As New SqlDataAdapter("SELECT * FROM Customers", oConexion) Dim daOrders As New SqlDataAdapter("SELECT * FROM Orders", oConexion) ' instanciar dataset oDataSet = New DataSet() oConexion.Open() ' utilizar los dataadapters para llenar el dataset con tablas daCustomers.Fill(oDataSet, "Customers") daOrders.Fill(oDataSet, "Orders") oConexion.Close() ' relacionar las dos tablas del dataset por campo comn oDataSet.Relations.Add("Customers_Orders", _ oDataSet.Tables("Customers").Columns("CustomerID"), _ oDataSet.Tables("Orders").Columns("CustomerID")) ' llenar el combobox con los nombres de cliente Dim oDataRow As DataRow For Each oDataRow In oDataSet.Tables("Customers").Rows Me.cboCustomers.Items.Add(oDataRow("CustomerID") & _ "-" & oDataRow("CompanyName")) Next

LECCION 7 El control DataGrid

Pgina 13

[VISUAL BASIC.NET CON BASE DE DATOS] IDSYSTEMS 2013


End Sub ' cada vez que se selecciona un valor en el combo ' se produce este evento Private Sub cboCustomers_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles cboCustomers.SelectedIndexChanged ' limpiar los valores del listbox Me.lstOrders.Items.Clear() Dim drFilaPadre As DataRow ' obtener la fila de la tabla maestra: Customers drFilaPadre = oDataSet.Tables("Customers").Rows(Me.cboCustomers.SelectedIndex) Dim drFilasHijas() As DataRow ' obtener las filas hijas de la tabla Orders, ' gracias a la relacin Customers-Orders drFilasHijas = drFilaPadre.GetChildRows("Customers_Orders") Dim drFila As DataRow ' rellenar el listbox con valores de las filas hijas For Each drFila In drFilasHijas Me.lstOrders.Items.Add(drFila("CustomerID") & _ "-" & drFila("OrderID") & _ "-" & drFila("OrderDate")) Next End Sub Cdigo fuente 586

La Figura 363 muestra este formulario.

Figura 363. Obtencin de filas relacionadas de forma manual.

LECCION 7 El control DataGrid

Pgina 14

[VISUAL BASIC.NET CON BASE DE DATOS] IDSYSTEMS 2013

Visualizar datos relacionados en modo maestro-detalle en un DataGrid


Podemos ahorrar la escritura de la instrucciones que se encargan de obtener las filas hijas, relacionadas con la fila seleccionada de la tabla padre, empleando un DataGrid. Este control implementa de forma transparente todos los mecanismos necesarios gracias al Data Binding, por lo que, una vez creada la relacin, slo hemos de asignar a su propiedad DataSource, la tabla padre del DataSet. El formulario frmRelacGrid, al que accederemos con el men Relacionar + DataGrid, es un ejemplo de este tipo de relacin de datos. El cdigo de su evento Load es igual al del anterior formulario, por lo que el Cdigo fuente 587 slo muestra la creacin de la relacin en el DataSet, y la asignacin de la tabla maestra al DataGrid.

' relacionar las dos tablas del dataset por campo comn oDataSet.Relations.Add("Customers_Orders", _ oDataSet.Tables("Customers").Columns("CustomerID"), _ oDataSet.Tables("Orders").Columns("CustomerID")) ' asignar la tabla maestra al datagrid Me.grdDatos.DataSource = oDataSet.Tables("Customers") Cdigo fuente 587

Al abrir este formulario, se visualizarn los datos de la tabla maestra Customers. Cada fila contiene un nodo expandible, que al ser pulsado muestra la relacin existente. Si volvemos a hacer clic sobre la relacin, se mostrarn en este caso las filas hijas de la tabla Orders, relacionadas con la que hemos seleccionado en la tabla padre. Ver Figura 364 y Figura 365. En todo momento, desde la vista de las tablas hijas, podemos volver a la vista de la tabla padre, haciendo clic en el icono con forma de flecha situado en el ttulo del DataGrid.

LECCION 7 El control DataGrid

Pgina 15

[VISUAL BASIC.NET CON BASE DE DATOS] IDSYSTEMS 2013


Figura 364. DataGrid mostrando filas de tabla maestra.

Figura 365. DataGrid mostrando filas de tabla detalle.

Mostrar una relacin maestro-detalle en dos DataGrid


Podemos separar la visualizacin de las tablas maestro y detalle en dos DataGrid independientes. Para sincronizar ambos controles, debemos asignar al que actuar como detalle, una cadena con el nombre de la tabla maestra, junto con el nombre de la relacin, empleando el siguiente formato: TablaMaestra.Relacin. El formulario frmDosGrid, que abriremos con la opcin de men Relacionar + Dos DataGrid, es un ejemplo de este tipo de organizacin de datos. En el Cdigo fuente 588 mostramos la parte del evento Load encargada de la creacin de la relacin entre tablas y asignacin a los DataGrid.

' relacionar las dos tablas del dataset por campo comn oDataSet.Relations.Add("Customers_Orders", _ oDataSet.Tables("Customers").Columns("CustomerID"), _ oDataSet.Tables("Orders").Columns("CustomerID")) ' asignar al datagrid maestro la tabla Customers Me.grdCustomers.DataSource = oDataSet Me.grdCustomers.DataMember = "Customers" ' asignar al datagrid detalles la relacin

' que acabamos de crear por cdigo Me.grdOrders.DataSource = oDataSet Me.grdOrders.DataMember = "Customers.Customers_Orders" Cdigo fuente 588

La Figura 366 muestra el formulario con ambos DataGrid trabajando en modo conjunto; al hacer clic en una fila del DataGrid maestro, el DataGrid detalle se actualizar con los datos relacionados. LECCION 7 El control DataGrid Pgina 16

[VISUAL BASIC.NET CON BASE DE DATOS] IDSYSTEMS 2013

Figura 366. Relacin maestro-detalle en dos DataGrid separados.

Relacin maestro-detalle en mltiples DataGrid


En este caso se trata de disponer de varios DataGrid maestros y uno para detalles, de forma que al hacer clic sobre cualquiera de los maestros, se muestre la informacin relacionada en el detalle. El formulario del proyecto encargado de este ejemplo ser frmVariosGrid. Respecto al cdigo, slo tenemos que asignar al nuevo DataGrid maestro la informacin de la tabla principal. Ver Cdigo fuente 589.

' relacionar las dos tablas del dataset por campo comn oDataSet.Relations.Add("Customers_Orders", _ oDataSet.Tables("Customers").Columns("CustomerID"), _ oDataSet.Tables("Orders").Columns("CustomerID")) ' asignar al datagrid maestro la tabla Customers Me.grdCustomers.DataSource = oDataSet Me.grdCustomers.DataMember = "Customers" ' asignar al segundo datagrid maestro la tabla Customers Me.grdCustomersB.DataSource = oDataSet Me.grdCustomersB.DataMember = "Customers"

' asignar al datagrid detalles la relacin ' que acabamos de crear por cdigo Me.grdOrders.DataSource = oDataSet Me.grdOrders.DataMember = "Customers.Customers_Orders"

LECCION 7 El control DataGrid

Pgina 17

[VISUAL BASIC.NET CON BASE DE DATOS] IDSYSTEMS 2013


Cdigo fuente 589

Veamos el resultado de la ejecucin en la Figura 367.

Figura 367. Varios DataGrid maestros contra uno de detalle.

Vistas y ordenacin de datos con la clase DataView


La clase DataView nos permite la aplicacin de vistas personalizadas a partir de una tabla contenida en un DataSet, as como la ordenacin y bsqueda de filas. En ADO clsico, para disponer de varias vistas de una misma tabla, debamos crear diferentes objetos Recordset, lo cual provocaba el consumo de una gran cantidad de recursos. Este aspecto ha cambiado profundamente en ADO .NET, ya que partiendo de un objeto DataTable situado en un DataSet, vamos a definir varias vistas simultneamente, ordenar y buscar registros, con la ventaja de que el consumo de recursos es menor, puesto que los objetos DataView se alimentan del mismo DataTable. Para realizar algunas pruebas, se acompaa el proyecto Vistas (hacer clic aqu para acceder al ejemplo). El DataSet del formulario de pruebas va a estar compuesto por dos tablas. El Cdigo fuente 590 muestra el evento de carga del formulario.

Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Load ' crear conexin Dim oConexion As New SqlConnection() oConexion.ConnectionString = "Server=(local);" & _ "Database=Northwind;uid=sa;pwd=;"

LECCION 7 El control DataGrid

Pgina 18

[VISUAL BASIC.NET CON BASE DE DATOS] IDSYSTEMS 2013

'crear dataset oDataSet = New DataSet() Dim oDataAdapter As SqlDataAdapter ' crear un adaptador de datos para la tabla Customers oDataAdapter = New SqlDataAdapter("SELECT * FROM Customers", oConexion) ' aadir tabla al dataset con el adaptador oDataAdapter.Fill(oDataSet, "Customers") oDataAdapter = Nothing ' crear un adaptador de datos para la tabla Products oDataAdapter = New SqlDataAdapter("SELECT * FROM Products", oConexion) ' aadir tabla al dataset con el adaptador oDataAdapter.Fill(oDataSet, "Products") oDataAdapter = Nothing End Sub Cdigo fuente 590

Vistas por cdigo y DefaultView


Podemos crear una vista instanciando un objeto de la clase DataView, o tambin obteniendo la denominada vista por defecto de una tabla de un DataSet, a travs de la propiedad DefaultView del objeto DataTable. La opcin de men Vistas + Normal del formulario, crea dos vistas de esta manera. Ver Cdigo fuente 591.

Private Sub mnuNormal_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles mnuNormal.Click ' crear una vista por cdigo y asignarla ' a un datagrid Dim dvNormal As DataView dvNormal = New DataView(oDataSet.Tables("Customers")) Me.grdDatos.CaptionText = "Customers" Me.grdDatos.DataSource = dvNormal ' tomar la vista por defecto de una tabla ' del dataset y asignarla a un datagrid Me.grdDatosBIS.CaptionText = "Products" Me.grdDatosBIS.DataSource = oDataSet.Tables("Products").DefaultView End Sub Cdigo fuente 591

La Figura 368 muestra estas vistas en sendos DataGrid del formulario.

LECCION 7 El control DataGrid

Pgina 19

[VISUAL BASIC.NET CON BASE DE DATOS] IDSYSTEMS 2013

Figura 368. Objetos DataView creados por cdigo y obtenido de DataTable.DefaultView.

Filtros con objetos DataView


La propiedad RowFilter de la clase DataView nos permite asignar a este objeto, una cadena con la expresin de filtro, que en una consulta en lenguaje SQL sera la parte correspondiente a la partcula Where. El Cdigo fuente 592 muestra el cdigo de la opcin de men Vistas + Pas, del formulario de ejemplo, en la que se crea un filtro que se muestra posteriormente en un DataGrid.

Private Sub mnuPais_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles mnuPais.Click ' crear dataview Dim oDataView As New DataView() oDataView.Table = oDataSet.Tables("Customers") ' establecer un filtro oDataView.RowFilter = "Country='Spain'" Me.grdDatos.CaptionText = "Filtrar Customers por pas Spain" Me.grdDatos.DataSource = oDataView End Sub Cdigo fuente 592

La Figura 369 muestra las filas de la tabla con el filtro aplicado. LECCION 7 El control DataGrid Pgina 20

[VISUAL BASIC.NET CON BASE DE DATOS] IDSYSTEMS 2013

Figura 369. DataView con filtro.

Como hemos comentado anteriormente, a partir de un DataTable podemos obtener varios filtros mediante distintos objetos DataView, sin que ello suponga una penalizacin en el consumo de recursos. Para demostrar este punto, la opcin Vistas + Combinada, crea una vista basada en un filtro combinado, y una vista normal, ambas empleando la misma tabla base. Veamos el Cdigo fuente 593.

Private Sub mnuCombinada_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles mnuCombinada.Click ' tomar la tabla Customers del dataset y aplicar... ' ...filtro combinado por dos campos y depositar en un datagrid Dim oDataView As New DataView() oDataView.Table = oDataSet.Tables("Customers") oDataView.RowFilter = "ContactTitle LIKE '%Manager%' AND Country IN ('Spain','USA')" Me.grdDatos.CaptionText = "Filtro combinado por campos ContactTitle y Country" Me.grdDatos.DataSource = oDataView ' ...filtro por un campo y depositar en otro datagrid Dim oDV As New DataView() oDV.Table = oDataSet.Tables("Customers") oDV.RowFilter = "ContactName LIKE '%an%'" Me.grdDatosBIS.CaptionText = "Filtro por campo ContactName" Me.grdDatosBIS.DataSource = oDV End Sub Cdigo fuente 593

La Figura 370 muestra el formulario con los diversos filtros establecidos

LECCION 7 El control DataGrid

Pgina 21

[VISUAL BASIC.NET CON BASE DE DATOS] IDSYSTEMS 2013

Figura 370. Filtros combinados con objetos DataView.

Bsquedas con DataView


Estableciendo el adecuado filtro a un objeto DataView, podemos realizar bsquedas de registros en tablas, como muestra el Cdigo fuente 594, correspondiente a la opcin de men Vistas + Buscar fila, del formulario de ejemplo. Deberemos previamente, haber escrito en el TextBox del formulario, el identificador de la tabla Customers a buscar.

Private Sub mnuBuscarFila_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles mnuBuscarFila.Click ' crear un dataview y buscar una fila en la vista ' estableciendo un filtro Dim oDataView As New DataView() oDataView.Table = oDataSet.Tables("Customers") oDataView.RowFilter = "CustomerID = '" & Me.txtCustomerID.Text & "'" Me.grdDatosBIS.CaptionText = "Buscar ID cliente: " & Me.txtCustomerID.Text Me.grdDatosBIS.DataSource = oDataView End Sub Cdigo fuente 594

En la Figura 371 vemos el resultado de una bsqueda, mostrado en uno de los DataGrid del formulario.

LECCION 7 El control DataGrid

Pgina 22

[VISUAL BASIC.NET CON BASE DE DATOS] IDSYSTEMS 2013

Figura 371. Bsqueda de una fila en una tabla de un DataSet, empleando un DataView.

Ordenacin de filas mediante DataView


Para ordenar las filas en un DataView emplearemos su propiedad Sort, asignndole una cadena con el nombre de columna/s a ordenar, tal y como muestra el Cdigo fuente 595, de la opcin de men Ordenacin + Normal, en el formulario del ejemplo.

Private Sub mnuOrdNormal_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles mnuOrdNormal.Click ' crear dataview y ordenar las filas ' con la propiedad Sort Dim oDataView As New DataView() oDataView.Table = oDataSet.Tables("Customers") oDataView.Sort = "Country" Me.grdDatos.CaptionText = "Ordenar por campo Country" Me.grdDatos.DataSource = oDataView End Sub Cdigo fuente 595

Veamos el resultado al ejecutar en la Figura 372. Si necesitamos ordenar por mltiples columnas de la tabla, slo tenemos que asignar a Sort una cadena con la LECCION 7 El control DataGrid Pgina 23

[VISUAL BASIC.NET CON BASE DE DATOS] IDSYSTEMS 2013


lista de columnas requeridas. Ver Cdigo fuente 596.

Figura 372. DataView ordenando las filas por la columna Country.

oDataView.Sort = "Country, PostalCode" Cdigo fuente 596

Tambin es factible asignar a un DataView una combinacin de filtro y ordenacin, utilizando en la misma operacin las propiedades RowFilter y Sort. El men del formulario Ordenacin + Con filtro realiza este trabajo, que vemos en el Cdigo fuente 597.

Private Sub mnuOrdenFiltro_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles mnuOrdenFiltro.Click Dim oDataView As New DataView() oDataView.Table = oDataSet.Tables("Customers") ' establecer un filtro al dataview oDataView.RowFilter = "Country='USA'" ' ordenar las filas del filtro oDataView.Sort = "City" Me.grdDatos.CaptionText = "Filtrar por USA. Ordenar por campo City" Me.grdDatos.DataSource = oDataView End Sub Cdigo fuente 597

Los datos con el filtro y orden podemos verlos en el DataGrid del formulario, que muestra la Figura 373.

LECCION 7 El control DataGrid

Pgina 24

[VISUAL BASIC.NET CON BASE DE DATOS] IDSYSTEMS 2013

Figura 373. Resultado de DataView con filtro y orden.

Obtener el esquema de un DataSet


El esquema de un DataSet consiste en toda la informacin contenida por este objeto, acerca de los nombres de tablas, columnas, relaciones, etc.; es decir, se trata de metainformacin sobre los datos que contiene el DataSet. Podemos obtener estos metadatos del DataSet recorriendo la coleccin que nos interese en cada caso: Tables, Columns, etc. El Cdigo fuente 598 muestra como tras crear un DataSet, recorremos sus tablas, y dentro de estas, sus columnas, mostrando la informacin obtenida en un ListBox. Este ejemplo, EsquemaDatos, puede obtenerse haciendo clic aqu.

Private Sub btnEsquema_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnEsquema.Click ' crear conexin Dim oConexion As New SqlConnection() oConexion.ConnectionString = "Server=(local);" & _ "Database=Northwind;uid=sa;pwd=;" ' crear dataset Dim oDataSet As New DataSet() ' crear adaptadores de datos para las tablas ' y aadir cada tabla al dataset con el adaptador Dim oDataAdapter As SqlDataAdapter oDataAdapter = New SqlDataAdapter("SELECT * FROM Customers", oConexion) oDataAdapter.Fill(oDataSet, "Customers") oDataAdapter = Nothing oDataAdapter = New SqlDataAdapter("SELECT * FROM Orders", oConexion) oDataAdapter.Fill(oDataSet, "Orders") oDataAdapter = Nothing

LECCION 7 El control DataGrid

Pgina 25

[VISUAL BASIC.NET CON BASE DE DATOS] IDSYSTEMS 2013


oDataAdapter = New SqlDataAdapter("SELECT * FROM Products", oConexion) oDataAdapter.Fill(oDataSet, "Products") oDataAdapter = Nothing oDataAdapter = New SqlDataAdapter("SELECT * FROM Territories", oConexion)

oDataAdapter.Fill(oDataSet, "Territories") oDataAdapter = Nothing ' crear un objeto tabla y columna para mostrar ' la informacin del esquema que el dataset contiene Dim oDataTable As DataTable Dim oDataColumn As DataColumn Me.lstEsquema.Items.Add("Estructura del DataSet") ' recorrer la coleccin de tablas del DataSet For Each oDataTable In oDataSet.Tables Me.lstEsquema.Items.Add("Tabla: " & oDataTable.TableName)

Next ' recorrer la coleccin de columnas de la tabla For Each oDataColumn In oDataTable.Columns Me.lstEsquema.Items.Add("Campo: " & _ oDataColumn.ColumnName & " --- " & _ "Tipo: " & oDataColumn.DataType.Name) Next End Sub Cdigo fuente 598

La Figura 374 muestra el ListBox relleno con el esquema del DataSet tras haber pulsado el botn del formulario.

LECCION 7 El control DataGrid

Pgina 26

[VISUAL BASIC.NET CON BASE DE DATOS] IDSYSTEMS 2013

Figura 374. Obtencin del esquema de un DataSet.

LECCION 7 El control DataGrid

Pgina 27

También podría gustarte