IES Fco. De Quevedo Desarrollo de Aplicaciones Informáticas Visual Basic Net – BD's.Datagrid, relaciones y vistas. Bases de Datos en VB.Net. El control Datagrid, Relaciones y Vistas.1 (cc) 2007 Justo Sáez Arenas http://vb.jsaez.com/ Contenidos: 1. Introducción.............................................................................................................................. 1 2. DataGrid .................................................................................................................................. 2 Creación de un DataGrid a través de los asistentes del IDE .................................................... 3 Creación de un DataGrid por código........................................................................................ 4 Configurar las propiedades del DataGrid .................................................................................5 Selección de tabla en el DataGrid ............................................................................................ 5 3. Relaciones entre tablas mediante objetos DataRelation .......................................................... 6 4. Relación maestro-detalle en múltiples DataGrid ................................................................... 10 5. Vistas y ordenación de datos con la clase DataView ............................................................ 11 Vistas por código y DefaultView ...........................................................................................12 Filtros con objetos DataView .................................................................................................13 Búsquedas con DataView ...................................................................................................... 14 Ordenación de filas mediante DataView ................................................................................15 6. Obtener el esquema de un DataSet ........................................................................................ 17 1.Introducción. En este tema comenzaremos tratantando de nuevo aspectos del control DataGrid, el cual nos permite trabajar con datos de forma cómoda y sencilla. A continuación se hablará de como obtener tablas relacionadas, de forma que podemos establecer una relacion entre tablas que visual se encargará de gestionar directamente. Gracias a la potencialidad de los objetos DataRealatión y los DataGrid, podremos construir aplicaciones tipicas de datos como son las relaciones 'Maestro-Detalle. Para finalizar se tratará un nuevo objeto llamado DataView, mediante el cual se realizan funciones de presentación de los datos en formato de tabla. 1 El contenido es © “Manual de Programación Visual Basic Net”- Luis Miguel Blanco. Editorial Eidos., la maquetación,. selección y adaptación del contenido es mía. Visual Basic .Net _ BD's. Datagrid, relaciones y vistas 1 IES Fco. De Quevedo Desarrollo de Aplicaciones Informáticas Visual Basic Net – BD's.Datagrid, relaciones y vistas. 2.DataGrid Este control, del que ya realizamos una pequeña introducción en el tema anterior, nos es muy útil para mostrar la información contenida en las bases de datos de forma rápida y casi sin programación. Mediante los DataGrid podemos editar, añadir y borrar registros. Teniendo en cuenta que se trabaja en desconexión, hasta que no se realice una actualización mediante un 'Update' no se reflejarán los cambios en la base de datos original. Otra característica incluida por defecto es la ordenación de las filas por columna al hacer clic en su título. Finalmente, al redimensionar el formulario, también cambiará el tamaño del DataGrid, puesto que hemos utilizado su propiedad Anchor para anclarlo a todos los bordes de la ventana. Un DataGrid editable. El siguiente sería el código principal de este formulario. En este caso la conexión a la base de datos se realiza de forma manual, debiendo, entre otras cosas, 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. 2 Private oDataAdapter As SqlDataAdapter Private oDataSet As DataSet 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 conexión Dim oConexion As New SqlConnection() oConexion.ConnectionString = "Server=(local);" & _ "Database=Musica;uid=sa;pwd=;" ' crear adaptador 2 Para los siguientes ejemplos de código, ttenemos una base de datos access llamada 'Musica', con dos tablas: 'Grabaciones' y 'Autores'. Visual Basic .Net _ BD's. Datagrid, relaciones y vistas 2 IES Fco. De Quevedo Desarrollo de Aplicaciones Informáticas Visual Basic Net – BD's.Datagrid, relaciones y vistas. 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 Creación de un DataGrid a través de los asistentes del IDE El modo más potente de crear un DataGrid es a través de código, ya que nos permite un mayor grado de manipulación de sus propiedades. Sin embargo, para aquellas ocasiones en que necesitemos una vista rápida de los datos en un formulario para pruebas o similares, podemos utilizar los asistentes de Visual Studio .NET, en lo que a creación 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 añadido el diseñador, abriremos la pestaña Explorador de servidores, y haciendo clic derecho en su elemento Conexiones de datos, nos mostrará la ventana para la creación de una nueva conexión con una base de datos, en ella introduciremos los valores necesarios para la conexión. Finalizada la creación del adaptador de datos, seleccionaremos el menú Datos + Generar conjunto de datos. A continuación 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. Propiedades del DataGrid para la obtención de datos. Visual Basic .Net _ BD's. Datagrid, relaciones y vistas 3 IES Fco. De Quevedo Desarrollo de Aplicaciones Informáticas Visual Basic Net – BD's.Datagrid, relaciones y vistas. Completado este último paso, el DataGrid mostrará en tiempo de diseño, la disposición de las columnas de la tabla en su interior. DataGrid mostrando información de las columnas de la tabla del DataSet. En cuanto al código que debemos escribir, en el evento Load, inicializaremos el DataSet, rellenándolo a continuación mediante el DataAdapter, como sigue: 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 Creación de un DataGrid por código. Supongamos ahora, que necesitamos por código modificar las propiedades no sólo 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. Private Sub frmGridPropCod_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Load ' crear conexión 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() Visual Basic .Net _ BD's. Datagrid, relaciones y vistas 4 IES Fco. De Quevedo Desarrollo de Aplicaciones Informáticas Visual Basic Net – BD's.Datagrid, relaciones y vistas. oDataAdapter.Fill(oDataSet, "Grabaciones") ' asignar dataset al datagrid Me.grdDatos.DataSource = oDataSet Me.grdDatos.DataMember = "Grabaciones" Configurar las propiedades del DataGrid En los casos anteriores, hemos creado un formulario con un DataGrid que tenía la apariencia visual por defecto de este control. Evidentemente, a través de las propiedades del DataGrid, tanto en diseño como en ejecución, podemos de un modo muy flexible y potente, cambiar la apariencia y el comportamiento de este control. En el formulario frmGridProp, mostramos la misma información que en el anterior ejemplo, pero con una presentación totalmente distinta, al modificar algunas propiedades del DataGrid como BackColor, AlternatingBackColor, CaptionText, etc. Figura 360. DataGrid con propiedades modificadas. Selección 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 embargo, si obviamos la asignación 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 dispone de este comportamiento. En su evento Load crearemos dos DataAdapter que usaremos para llenar un DataSet. Private Sub frmGridTablas_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Load ' crear conexión Dim oConexion As New SqlConnection() Visual Basic .Net _ BD's. Datagrid, relaciones y vistas 5 IES Fco. De Quevedo Desarrollo de Aplicaciones Informáticas Visual Basic Net – BD's.Datagrid, relaciones y vistas. 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 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. Selección de tabla a mostrar en un DataGrid, 3.Relaciones entre tablas mediante objetos DataRelation Los objetos DataRelation nos permiten establecer una relación entre dos tablas (objetos DataTable) de un DataSet, a través de una columna o campo común (objetos DataColumn). Obtener tablas relacionadas mediante código En primer lugar al cargar el formulario, creamos una relación entre dos tablas por un campo clave. Después llenamos un ComboBox con datos de la tabla Customers. Al seleccionar un valor del ComboBox, se tomarán las filas relacionadas de la tabla Orders y se llenará con ellas un ListBox. El código necesario podemos verlo en el Código fuente 586. 3 Private Sub frmManual_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Load ' crear conexión Dim oConexion As New SqlConnection() 3 Para los siguientes ejemplos de código, tenemos una base de datos access llamada 'Northwind', con dos tablas: 'Customer' y 'Orders'. Visual Basic .Net _ BD's. Datagrid, relaciones y vistas 6 IES Fco. De Quevedo Desarrollo de Aplicaciones Informáticas Visual Basic Net – BD's.Datagrid, relaciones y vistas. 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 común 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 'Carga el combobox(cboCustomer) con dos campos de la tabla Customer ' (CustomerID y CompanyName) For Each oDataRow In oDataSet.Tables("Customers").Rows Me.cboCustomers.Items.Add(oDataRow("CustomerID" ) & _ "-" & oDataRow("CompanyName")) Next 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 relación 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 Visual Basic .Net _ BD's. Datagrid, relaciones y vistas 7 IES Fco. De Quevedo Desarrollo de Aplicaciones Informáticas Visual Basic Net – BD's.Datagrid, relaciones y vistas. Se obtendría algo similar al siguiente formulario: Obtención de filas relacionadas de forma manual. 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 relación, sólo hemos de asignar a su propiedad DataSource, la tabla padre del DataSet. El formulario frmRelacGrid, es un ejemplo de este tipo de relación de datos. El código de su evento Load es igual al del anterior formulario, por lo que el siguiente código fuente sólo muestra la creación de la relación en el DataSet, y la asignación de la tabla maestra al DataGrid. ' relacionar las dos tablas del dataset por campo común 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") Al abrir este formulario, se visualizarán los datos de la tabla maestra. Cada fila contiene un nodo expandible, que al ser pulsado muestra la relación existente. Si volvemos a hacer clic sobre la relación, se mostrarán en este caso las filas hijas de la tabla Orders, relacionadas con la que hemos seleccionado en la tabla padre. 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 título del DataGrid. Visual Basic .Net _ BD's. Datagrid, relaciones y vistas 8 IES Fco. De Quevedo Desarrollo de Aplicaciones Informáticas Visual Basic Net – BD's.Datagrid, relaciones y vistas. DataGrid mostrando filas de tabla maestra. DataGrid mostrando filas de tabla detalle. Mostrar una relación maestro-detalle en dos DataGrid Podemos separar la visualización 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 relación, empleando el siguiente formato: TablaMaestra.Relación. El formulario frmDosGrid, es un ejemplo de este tipo de organización de datos. En el código fuente mostramos la parte del evento Load encargada de la creación de la relación entre tablas y asignación a los DataGrid. ' relacionar las dos tablas del dataset por campo común 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 relación Visual Basic .Net _ BD's. Datagrid, relaciones y vistas 9 IES Fco. De Quevedo Desarrollo de Aplicaciones Informáticas Visual Basic Net – BD's.Datagrid, relaciones y vistas. ' que acabamos de crear por código Me.grdOrders.DataSource = oDataSet Me.grdOrders.DataMember = "Customers.Customers_Orders" En la siguiente figura se 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. Relación maestro-detalle en dos DataGrid separados. 4.Relación maestro-detalle en múltiples 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 información relacionada en el detalle. El formulario del proyecto encargado de este ejemplo será frmVariosGrid. Respecto al código, sólo tenemos que asignar al nuevo DataGrid maestro la información de la tabla principal. Ver código fuente. ' relacionar las dos tablas del dataset por campo común 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 relación ' que acabamos de crear por código Me.grdOrders.DataSource = oDataSet Me.grdOrders.DataMember = "Customers.Customers_Orders" Visual Basic .Net _ BD's. Datagrid, relaciones y vistas 10 IES Fco. De Quevedo Desarrollo de Aplicaciones Informáticas Visual Basic Net – BD's.Datagrid, relaciones y vistas. Veamos el resultado de la ejecución en la Figura 367. Varios DataGrid maestros contra uno de detalle. 5.Vistas y ordenación de datos con la clase DataView La clase DataView nos permite la aplicación de vistas personalizadas a partir de una tabla contenida en un DataSet, así como la ordenación y búsqueda de filas. En ADO .NET, partiendo de un objeto DataTable situado en un DataSet, vamos a definir varias vistas simultáneamente, 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. El DataSet del formulario de pruebas va a estar compuesto por dos tablas. El Código fuente muestra el evento de carga del formulario. Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Load ' crear conexión Dim oConexion As New SqlConnection() oConexion.ConnectionString = "Server=(local);" & _ "Database=Northwind;uid=sa;pwd=;" Dim oDataAdapter As SqlDataAdapter ' crear un adaptador de datos para la tabla Customers oDataAdapter = New SqlDataAdapter("SELECT * FROM Customers", oConexion) ' crear un adaptador de datos para la tabla Products oDataAdapter = New SqlDataAdapter("SELECT * FROM Products", oConexion) 'crear dataset oDataSet = New DataSet() ' añadir tabla al dataset con el adaptador oDataAdapter.Fill(oDataSet, "Customers") oDataAdapter = Nothing Visual Basic .Net _ BD's. Datagrid, relaciones y vistas 11 IES Fco. De Quevedo Desarrollo de Aplicaciones Informáticas Visual Basic Net – BD's.Datagrid, relaciones y vistas. ' añadir tabla al dataset con el adaptador oDataAdapter.Fill(oDataSet, "Products") oDataAdapter = Nothing End Sub Vistas por código y DefaultView Podemos crear una vista instanciando un objeto de la clase DataView, o también obteniendo la denominada vista por defecto de una tabla de un DataSet, a través de la propiedad DefaultView del objeto DataTable. En el siguiente código se crean dos vistas de esta manera. Private Sub mnuNormal_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles mnuNormal.Click ' crear una vista por código 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 Y este será el resultado mostrando estas vistas en sendos DataGrid del formulario. Objetos DataView creados por código y obtenido de DataTable.DefaultView. Visual Basic .Net _ BD's. Datagrid, relaciones y vistas 12 IES Fco. De Quevedo Desarrollo de Aplicaciones Informáticas Visual Basic Net – BD's.Datagrid, relaciones y vistas. Filtros con objetos DataView La propiedad RowFilter de la clase DataView nos permite asignar a este objeto, una cadena con la expresión de filtro, que en una consulta en lenguaje SQL sería la parte correspondiente a la partícula Where. El código fuente muestra el código de la opción de menú , 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 país Spain" Me.grdDatos.DataSource = oDataView End Sub Así se muestra las filas de la tabla con el filtro aplicado. 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 penalización en el consumo de recursos. Para demostrar este punto, en el siguiente código se crea una vista basada en un filtro combinado, y una vista normal, ambas empleando la misma tabla base. 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") Visual Basic .Net _ BD's. Datagrid, relaciones y vistas 13 IES Fco. De Quevedo Desarrollo de Aplicaciones Informáticas Visual Basic Net – BD's.Datagrid, relaciones y vistas. 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 El formulario con los diversos filtros establecidos Filtros combinados con objetos DataView. Búsquedas con DataView Estableciendo el adecuado filtro a un objeto DataView, podemos realizar búsquedas de registros en tablas, como muestra el código fuente , correspondiente a la opción 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 Visual Basic .Net _ BD's. Datagrid, relaciones y vistas 14 IES Fco. De Quevedo Desarrollo de Aplicaciones Informáticas Visual Basic Net – BD's.Datagrid, relaciones y vistas. ' 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 Veamos el resultado de una búsqueda, mostrado en uno de los DataGrid del formulario. Búsqueda de una fila en una tabla de un DataSet, empleando un DataView. Ordenación de filas mediante DataView Para ordenar las filas en un DataView emplearemos su propiedad Sort, asignándole una cadena con el nombre de columna/s a ordenar, tal y como muestra el código fuente, de la opción de menú Ordenación + 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 Visual Basic .Net _ BD's. Datagrid, relaciones y vistas 15 IES Fco. De Quevedo Desarrollo de Aplicaciones Informáticas Visual Basic Net – BD's.Datagrid, relaciones y vistas. Veamos el resultado al ejecutar: DataView ordenando las filas por la columna Country. Si necesitamos ordenar por múltiples columnas de la tabla, sólo tenemos que asignar a Sort una cadena con la lista de columnas requeridas como sigue: oDataView.Sort = "Country, PostalCode" También es factible asignar a un DataView una combinación de filtro y ordenación, utilizando en la misma operación las propiedades RowFilter y Sort. El menú del formulario Ordenación + Con filtro realiza este trabajo, que vemos en el código fuente. 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 Los datos con el filtro y orden podemos verlos en el DataGrid del formulario, que muestra la Figura 373. Resultado de DataView con filtro y orden. Visual Basic .Net _ BD's. Datagrid, relaciones y vistas 16 IES Fco. De Quevedo Desarrollo de Aplicaciones Informáticas Visual Basic Net – BD's.Datagrid, relaciones y vistas. 6.Obtener el esquema de un DataSet El esquema de un DataSet consiste en toda la información contenida por este objeto, acerca de los nombres de tablas, columnas, relaciones, etc.; es decir, se trata de metainformación sobre los datos que contiene el DataSet. Podemos obtener estos metadatos del DataSet recorriendo la colección que nos interese en cada caso: Tables, Columns, etc. El código fuente muestra como tras crear un DataSet, recorremos sus tablas, y dentro de estas, sus columnas, mostrando la información obtenida en un ListBox. Private Sub btnEsquema_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnEsquema.Click ' crear conexión 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 añadir 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 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 información del esquema que el dataset contiene Dim oDataTable As DataTable Dim oDataColumn As DataColumn Me.lstEsquema.Items.Add("Estructura del DataSet") ' recorrer la colección de tablas del DataSet For Each oDataTable In oDataSet.Tables Me.lstEsquema.Items.Add("Tabla: " & oDataTable.TableName) ' recorrer la colección de columnas de la tabla For Each oDataColumn In oDataTable.Columns Me.lstEsquema.Items.Add("Campo: " & _ oDataColumn.ColumnName & " --- " & _ "Tipo: " & oDataColumn.DataType.Name) Next Next End Sub Visual Basic .Net _ BD's. Datagrid, relaciones y vistas 17 IES Fco. De Quevedo Desarrollo de Aplicaciones Informáticas Visual Basic Net – BD's.Datagrid, relaciones y vistas. El ListBox relleno con el esquema del DataSet tras haber pulsado el botón del formulario. Visual Basic .Net _ BD's. Datagrid, relaciones y vistas 18