Beruflich Dokumente
Kultur Dokumente
Contenidos:
1. Introduccin.............................................................................................................................. 1 2. DataGrid .................................................................................................................................. 2 Creacin de un DataGrid a travs de los asistentes del IDE .................................................... 3 Creacin de un DataGrid por cdigo........................................................................................ 4 Configurar las propiedades del DataGrid .................................................................................5 Seleccin de tabla en el DataGrid ............................................................................................ 5 3. Relaciones entre tablas mediante objetos DataRelation .......................................................... 6 4. Relacin maestro-detalle en mltiples DataGrid ................................................................... 10 5. Vistas y ordenacin de datos con la clase DataView ............................................................ 11 Vistas por cdigo y DefaultView ...........................................................................................12 Filtros con objetos DataView .................................................................................................13 Bsquedas con DataView ...................................................................................................... 14 Ordenacin de filas mediante DataView ................................................................................15 6. Obtener el esquema de un DataSet ........................................................................................ 17
1.Introduccin.
En este tema comenzaremos tratantando de nuevo aspectos del control DataGrid, el cual nos permite trabajar con datos de forma cmoda y sencilla. A continuacin 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 DataRealatin 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 presentacin de los datos en formato de tabla.
1
El contenido es Manual de Programacin Visual Basic Net- Luis Miguel Blanco. Editorial Eidos., la maquetacin,. seleccin y adaptacin del contenido es ma.
Visual Basic .Net _ BD's. Datagrid, relaciones y vistas
IES Fco. De Quevedo Desarrollo de Aplicaciones Informticas Visual Basic Net BD's.Datagrid, relaciones y vistas.
2.DataGrid
Este control, del que ya realizamos una pequea introduccin en el tema anterior, nos es muy til para mostrar la informacin contenida en las bases de datos de forma rpida y casi sin programacin. Mediante los DataGrid podemos editar, aadir y borrar registros. Teniendo en cuenta que se trabaja en desconexin, hasta que no se realice una actualizacin mediante un 'Update' no se reflejarn los cambios en la base de datos original. 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.
Un DataGrid editable.
El siguiente sera el cdigo principal de este formulario. En este caso la conexin 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.
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 conexin Dim oConexion As New SqlConnection() oConexion.ConnectionString = "Server=(local);" & _ "Database=Musica;uid=sa;pwd=;" ' crear adaptador
2
Para los siguientes ejemplos de cdigo, ttenemos una base de datos access llamada 'Musica', con dos tablas: 'Grabaciones' y 'Autores'. Visual Basic .Net _ BD's. Datagrid, relaciones y vistas
IES Fco. De Quevedo Desarrollo de Aplicaciones Informticas 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
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 ella introduciremos los valores necesarios para la conexin.
Finalizada la creacin del adaptador de datos, seleccionaremos el men Datos + Generar conjunto de datos.
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.
IES Fco. De Quevedo Desarrollo de Aplicaciones Informticas Visual Basic Net BD's.Datagrid, relaciones y vistas.
Completado este ltimo paso, el DataGrid mostrar en tiempo de diseo, la disposicin de las columnas de la tabla en su interior.
En cuanto al cdigo que debemos escribir, en el evento Load, inicializaremos el DataSet, rellenndolo a continuacin 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
' crear adaptador oDataAdapter = New SqlDataAdapter("SELECT * FROM Grabaciones", oConexion) ' crear commandbuilder Dim oCB As SqlCommandBuilder = New SqlCommandBuilder(oDataAdapter) ' crear dataset oDataSet = New DataSet()
IES Fco. De Quevedo Desarrollo de Aplicaciones Informticas Visual Basic Net BD's.Datagrid, relaciones y vistas.
oDataAdapter.Fill(oDataSet, "Grabaciones")
Private Sub frmGridTablas_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Load ' crear conexin Dim oConexion As New SqlConnection()
IES Fco. De Quevedo Desarrollo de Aplicaciones Informticas 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.
Para los siguientes ejemplos de cdigo, tenemos una base de datos access llamada 'Northwind', con dos tablas: 'Customer' y 'Orders'. Visual Basic .Net _ BD's. Datagrid, relaciones y vistas
IES Fco. De Quevedo Desarrollo de Aplicaciones Informticas 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 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 '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 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
IES Fco. De Quevedo Desarrollo de Aplicaciones Informticas Visual Basic Net BD's.Datagrid, relaciones y vistas.
' 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")
Al abrir este formulario, se visualizarn los datos de la tabla maestra. 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. 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.
IES Fco. De Quevedo Desarrollo de Aplicaciones Informticas Visual Basic Net BD's.Datagrid, relaciones y vistas.
' 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 Visual Basic .Net _ BD's. Datagrid, relaciones y vistas
IES Fco. De Quevedo Desarrollo de Aplicaciones Informticas Visual Basic Net BD's.Datagrid, relaciones y vistas.
' que acabamos de crear por cdigo 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.
' 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"
10
IES Fco. De Quevedo Desarrollo de Aplicaciones Informticas Visual Basic Net BD's.Datagrid, relaciones y vistas.
Veamos el resultado de la ejecucin en la Figura 367.
' crear conexin 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() ' aadir tabla al dataset con el adaptador oDataAdapter.Fill(oDataSet, "Customers") oDataAdapter = Nothing
11
IES Fco. De Quevedo Desarrollo de Aplicaciones Informticas Visual Basic Net BD's.Datagrid, relaciones y vistas.
' aadir tabla al dataset con el adaptador oDataAdapter.Fill(oDataSet, "Products") oDataAdapter = Nothing End Sub
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
Y este ser el resultado mostrando estas vistas en sendos DataGrid del formulario.
12
IES Fco. De Quevedo Desarrollo de Aplicaciones Informticas 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 expresin de filtro, que en una consulta en lenguaje SQL sera la parte correspondiente a la partcula Where. El cdigo fuente muestra el cdigo de la opcin 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 pas Spain" Me.grdDatos.DataSource = oDataView End Sub
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, en el siguiente cdigo 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")
13
IES Fco. De Quevedo Desarrollo de Aplicaciones Informticas 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
14
IES Fco. De Quevedo Desarrollo de Aplicaciones Informticas 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 bsqueda, mostrado en uno de los DataGrid del formulario.
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
15
IES Fco. De Quevedo Desarrollo de Aplicaciones Informticas Visual Basic Net BD's.Datagrid, relaciones y vistas.
Veamos el resultado al ejecutar:
Si necesitamos ordenar por mltiples columnas de la tabla, slo tenemos que asignar a Sort una cadena con la lista de columnas requeridas como sigue:
oDataView.Sort = "Country, PostalCode"
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.
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.
16
IES Fco. De Quevedo Desarrollo de Aplicaciones Informticas Visual Basic Net BD's.Datagrid, relaciones y vistas.
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 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) ' 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 Next End Sub
17
IES Fco. De Quevedo Desarrollo de Aplicaciones Informticas Visual Basic Net BD's.Datagrid, relaciones y vistas. El ListBox relleno con el esquema del DataSet tras haber pulsado el botn del formulario.
18