Documentos de Académico
Documentos de Profesional
Documentos de Cultura
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 ta la en el DataGrid ............................................................................................ 5 3. !elaciones entre ta las "ediante o #etos Data!elation .......................................................... $ 4. !elacin "aestro%detalle en "<iples DataGrid ................................................................... 1' 5. (istas ) ordenacin de datos con la clase Data(ie* ............................................................ 11 (istas por cdigo ) Default(ie* ...........................................................................................12 +iltros con o #etos Data(ie* .................................................................................................13 ,&s-uedas con Data(ie* ...................................................................................................... 14 .rdenacin de filas "ediante Data(ie* ................................................................................15 $. . tener el es-ue"a de un DataSet ........................................................................................ 1/
1.+ntroducci,n.
En este te"a co"en0are"os tratantando de nuevo aspectos del control DataGrid1 el cual nos per"ite tra a#ar con datos de for"a c"oda ) sencilla. 2 continuacin se 3a lar4 de co"o o tener ta las relacionadas1 de for"a -ue pode"os esta lecer una relacion entre ta las -ue visual se encargar4 de gestionar directa"ente. Gracias a la potencialidad de los o #etos Data!ealatin ) los DataGrid1 podre"os construir aplicaciones tipicas de datos co"o son las relaciones 56aestro%Detalle. 7ara finali0ar se tratar4 un nuevo o #eto lla"ado Data(ie*1 "ediante el cual se reali0an funciones de presentacin de los datos en for"ato de ta la.
1
El contenido es 8 96anual de 7rogra"acin (isual ,asic :et;% <uis 6iguel ,lanco. Editorial Eidos.1 la "a-uetacin1. seleccin ) adaptacin del contenido es "=a.
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.Data-rid
Este control1 del -ue )a reali0a"os una pe-ue>a introduccin en el te"a anterior1 nos es "u) &til para "ostrar la infor"acin contenida en las ases de datos de for"a r4pida ) casi sin progra"acin. 6ediante los DataGrid pode"os editar1 a>adir ) orrar registros. ?eniendo en cuenta -ue se tra a#a en descone@in1 3asta -ue no se realice una actuali0acin "ediante un 5Apdate5 no se refle#ar4n los ca" ios en la ase de datos original. .tra caracter=stica incluida por defecto es la ordenacin de las filas por colu"na al 3acer clic en su t=tulo. +inal"ente1 al redi"ensionar el for"ulario1 ta" in ca" iar4 el ta"a>o del DataGrid1 puesto -ue 3e"os utili0ado su propiedad 2nc3or para anclarlo a todos los ordes de la ventana.
El siguiente ser=a el cdigo principal de este for"ulario. En este caso la cone@in a la ase de datos se reali0a de for"a "anual1 de iendo1 entre otras cosas1 crear un o #eto Co""and,uilder para el Data2dapter1 )a -ue en caso contrario1 al intentar actuali0ar el DataSet contra la ase de datos1 se producir4 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 c digo! ttenemos una "ase de datos access llamada #$usica#! con dos ta"las% #&ra"aciones# ' #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
(a"os a crear por lo tanto un nuevo for"ulario para el pro)ecto con el no" re fr"Grid2sist. Ana ve0 a>adido el dise>ador1 a rire"os la pesta>a Explorador de servidores1 ) 3aciendo clic derec3o en su ele"ento Conexiones de datos1 nos "ostrar4 la ventana para la creacin de una nueva cone@in con una ase de datos1 en ella introducire"os los valores necesarios para la cone@in.
+inali0ada la creacin del adaptador de datos1 seleccionare"os el "en& Datos B Generar con#unto de datos.
2 continuacin di u#are"os un DataGrid en el for"ulario1 ) pasare"os a su ventana de propiedades. En la propiedad DataSource asignare"os el DataSet -ue aca a"os de crear1 "ientras -ue en la propiedad Data6e" er1 seleccionare"os la ta la del DataSet -ue va a "ostrar el DataGrid.
IES Fco. De Quevedo Desarrollo de Aplicaciones Informticas Visual Basic Net BD's.Datagrid, relaciones y vistas.
Co"pletado este <i"o paso1 el DataGrid "ostrar4 en tie"po de dise>o1 la disposicin de las colu"nas de la ta la en su interior.
En cuanto al cdigo -ue de e"os escri ir1 en el evento <oad1 iniciali0are"os el DataSet1 rellen4ndolo a continuacin "ediante el Data2dapter1 co"o sigueC
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
Co"o al asignar el DataSet al DataGrid no 3e"os indicado -u ta la -uere"os -ue "uestre1 el DataGrid en el for"ulario visuali0ar4 un nodo -ue al e@pandir1 nos per"itir4 seleccionar la ta la a "ostrar. 7odre"os contraer dic3a ta la para seleccionar otra1 ) as= sucesiva"ente.
Para los siguientes ejemplos de c digo! tenemos una "ase de datos access llamada #)ort*+ind#! con dos ta"las% #,ustomer# ' #-rders#. 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")
2l a rir este for"ulario1 se visuali0ar4n los datos de la ta la "aestra. Cada fila contiene un nodo e@pandi le1 -ue al ser pulsado "uestra la relacin e@istente. Si volve"os a 3acer clic so re la relacin1 se "ostrar4n en este caso las filas 3i#as de la ta la .rders1 relacionadas con la -ue 3e"os seleccionado en la ta la padre. En todo "o"ento1 desde la vista de las ta las 3i#as1 pode"os volver a la vista de la ta la padre1 3aciendo clic en el icono con for"a de flec3a situado en el t=tulo 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 "uestra el for"ulario con a" os DataGrid tra a#ando en "odo con#untoI al 3acer clic en una fila del DataGrid "aestro1 el DataGrid detalle se actuali0ar4 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"
1'
IES Fco. De Quevedo Desarrollo de Aplicaciones Informticas Visual Basic Net BD's.Datagrid, relaciones y vistas.
(ea"os el resultado de la e#ecucin en la +igura 3$/.
' 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
J este ser4 el resultado "ostrando estas vistas en sendos DataGrid del for"ulario.
12
IES Fco. De Quevedo Desarrollo de Aplicaciones Informticas Visual Basic Net BD's.Datagrid, relaciones y vistas. Filtros con ob etos DataView
<a propiedad !o*+ilter de la clase Data(ie* nos per"ite asignar a este o #eto1 una cadena con la e@presin de filtro1 -ue en una consulta en lengua#e SK< ser=a la parte correspondiente a la part=cula L3ere. El cdigo fuente "uestra el cdigo de la opcin de "en& 1 en la -ue se crea un filtro -ue se "uestra posterior"ente 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
Co"o 3e"os co"entado anterior"ente1 a partir de un Data?a le pode"os o tener varios filtros "ediante distintos o #etos Data(ie*1 sin -ue ello suponga una penali0acin en el consu"o de recursos. 7ara de"ostrar este punto1 en el siguiente cdigo se crea una vista asada en un filtro co" inado1 ) una vista nor"al1 a" as e"pleando la "is"a ta la ase.
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
(ea"os el resultado de una &s-ueda1 "ostrado en uno de los DataGrid del for"ulario.
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.
(ea"os el resultado al e#ecutarC
Si necesita"os ordenar por "<iples colu"nas de la ta la1 slo tene"os -ue asignar a Sort una cadena con la lista de colu"nas re-ueridas co"o sigueC
oDataView.Sort = "Country, PostalCode"
?a" in es facti le asignar a un Data(ie* una co" inacin de filtro ) ordenacin1 utili0ando en la "is"a operacin las propiedades !o*+ilter ) Sort. El "en& del for"ulario Ordenacin + Con filtro reali0a este tra a#o1 -ue ve"os 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
<os datos con el filtro ) orden pode"os verlos en el DataGrid del for"ulario1 -ue "uestra la +igura 3/3.
1$
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
1/
IES Fco. De Quevedo Desarrollo de Aplicaciones Informticas Visual Basic Net BD's.Datagrid, relaciones y vistas. El <ist,o@ relleno con el es-ue"a del DataSet tras 3a er pulsado el otn del for"ulario.
1G