Está en la página 1de 19

1. Visualizacin. 1.1 Introduccin.

Objetos de visualizacin pueden ser cualquiera que nosotros queramos utilizar. Pero aquellos ms habituales en el enlace con las Bases de datos podan ser DataGridView TextBox .. ListBox.

Es un objeto de visualizacin, es una evolucin del objeto DataGrid. Es una cuadricula en la que se pueden visualizar datos enlazados a una tabla, o provenientes de cualquier otra estructura de datos. El enlace de las tablas a la cuadrcula se realiza mediante la propiedad DataSource. Cuando se realiza ste enlace no es posible aadir filas de forma manual al DataGrid. Dispone de un sin fin de opciones de configuracin para mejorar el formato de visualizacin. Existe la clase DataGridViewCellStyle, que gestiona los estilos de formato de dicho objeto, si bien se recomienda no utilizarla cuando el volumen de datos es muy elevado. Cuando se desea visualizar un elevado volumen de datos en este objeto, se debe activar la propiedad VirtualMode en true, para mejorar el rendimiento. Vemos un ejemplo de configuracin de dicho objeto, por cuestiones estticas hay que destacar la combinacin de las siguientes propiedades que permiten obtener una visualizacin de las filas en un formato similar al antiguo papel pijama, lo cual facilita su interpretacin, solo hay que utilizar dos colores contrastados y de tonos suaves que no impidan la legibilidad del texto. ' Asignar el color de fondo para las filas de forma alternativa. ObjDataGrid.AlternatingRowsDefaultCellStyle.BackColor = Color.Cornsilk ObjDataGrid.RowsDefaultCellStyle.BackColor = Color.BlanchedAlmond En el apartado del teclado, quizs tenga algunas deficiencias, pero se podran solucionar creando una clase que herede este objeto y en el cual se potencie el tratamiento del teclado, para as poder filtrar convenientemente los datos. El ejemplo es un poco largo, y no todo es necesario, pero tiene un pequeo resumen de las propiedades de configuracin ms relevantes. Public Sub ConfigDataGrid(ByVal Formulario As Form, _ ByRef ObjDataGrid As DataGridView, _ ByVal Estado As Boolean) ' Inicializar propiedades bsicas ' Forma de acople del objeto a su contenedor, el Form ' DockStyle.None, respeta el formato del diseo ' DockStyle.Fill, genera espacio para cada columna y activa la barra ' horizontal si es necesario. ' los dems no generan pegas. With ObjDataGrid .Dock = DockStyle.None ' DockStyle.Fill ' Color de fondo de la zona no ocupada por el datagrid .BackgroundColor = Formulario.BackColor ' texto del datagrid .ForeColor = Color.Black ' Estilo del borde .BorderStyle = BorderStyle.None ' Estilo del objeto

1.2 DataGridView.

1.2.1 Configuracin.

.CellBorderStyle = DataGridViewCellBorderStyle.Single ' color de las lineas entre celdas, el grid .GridColor = SystemColors.ActiveBorder ' Columna de cursor lateral .RowHeadersVisible = False ' Asignar color de fondo de la celda que toma el foco .DefaultCellStyle.SelectionBackColor = Color.White ' Asignar color de primer plano de la celda que toma el foco .DefaultCellStyle.SelectionForeColor = Color.Black ' Generar columnas automtico .AutoGenerateColumns = True ' Asignar valores apropiados para solo lectura y limitar la ' interaccin con el objeto .AllowUserToAddRows = Estado .AllowUserToDeleteRows = estado .AllowUserToOrderColumns = Estado .EditMode = DataGridViewEditMode.EditOnEnter .ReadOnly = False ' Sistema de seleccin de las celdas .SelectionMode = DataGridViewSelectionMode.FullRowSelect .MultiSelect = False ' Columnas del DataGrid para ajustadas al contenido cargado .AutoResizeColumns(DataGridViewAutoSizeColumnsMode.AllCellsExceptHeader) ' Tamao de las celdas, influye sobre las de AllowUserToResize... .AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.DisplayedCells ' El usuario puede o no cambiar el tamao en alto o ancho .AllowUserToResizeColumns = True .AllowUserToResizeRows = True End With With ObjDataGrid.ColumnHeadersDefaultCellStyle ' Asignar la fila y columna de estilo de cabecera .ForeColor = Color.Yellow .BackColor = Color.Black .Alignment = DataGridViewContentAlignment.MiddleCenter .SelectionForeColor = Color.Coral .WrapMode = DataGridViewTriState.NotSet End With With ObjDataGrid .ColumnHeadersHeightSizeMode = _ DataGridViewColumnHeadersHeightSizeMode.AutoSize .ColumnHeadersBorderStyle = DataGridViewHeaderBorderStyle.Sunken ' Asignar Estilo de seleccin de fila de cabecera por defecto de forma ' que el valor no se superponga a los valores de estilo de las celdas. .RowHeadersDefaultCellStyle.SelectionBackColor = Color.Coral .RowHeadersDefaultCellStyle.BackColor = Color.Blue .RowHeadersWidthSizeMode = _ DataGridViewRowHeadersWidthSizeMode.AutoSizeToFirstHeader ' Asignar el color de fondo para las filas de forma alternativa .AlternatingRowsDefaultCellStyle.BackColor = Color.Cornsilk .RowsDefaultCellStyle.BackColor = Color.BlanchedAlmond End With End Sub

Independientemente de la configuracin anterior, en cada programa se puede personalizar el ancho y alineacin de las columnas. ObjDataGrid.Columns(0).Width = CInt(ObjDataGrid.Width * 0.08) Y tambin la alineacin de una columna. ObjDataGrid.Columns(3).DefaultCellStyle.Alignment = _ DataGridViewContentAlignment.MiddleRight Un ejemplo podra ser ste en el que el ancho de las columnas se asignan como un porcentaje del ancho del objeto. ObjDataGrid.Columns(0).Width = CInt(ObjDataGrid.Width * 0.08) ObjDataGrid.Columns(1).Width = CInt(ObjDataGrid.Width * 0.1) ObjDataGrid.Columns(2).Width = CInt(ObjDataGrid.Width * 0.5) ObjDataGrid.Columns(3).Width = CInt(ObjDataGrid.Width * 0.1) ObjDataGrid.Columns(3).DefaultCellStyle.Alignment = _ DataGridViewContentAlignment.MiddleRight ObjDataGrid.Columns(4).Width = CInt(ObjDataGrid.Width * 0.12) ObjDataGrid.Columns(4).DefaultCellStyle.Alignment = _ DataGridViewContentAlignment.MiddleRight

La carga de datos de ste objeto para su uso enlazado con una tabla de la base de datos es como sigue en el ejemplo. Public Sub CargaDataGrid( _ ByVal Conexion As System.Data.OleDb.OleDbConnection, _ ByRef Adaptador As System.Data.OleDb.OleDbDataAdapter, _ ByRef EnlaceTabla As BindingSource, _ ByRef ObjDataGrid As DataGridView, _ ByVal CadenaSql As String) Dim ComandoActualizar As OleDb.OleDbCommandBuilder Try ' Crear un nuevo adaptador de datos Adaptador = New OleDb.OleDbDataAdapter(CadenaSql, Conexion) ' Crear un 'commandbuilder' que genere el SQL Update/Insert/Delete ' el comando, no puede cambiarse de sitio pues captura datos de la ' operacin anterior del adaptador. ComandoActualizar = New OleDb.OleDbCommandBuilder(Adaptador) ' Llenar la tabla con los datos y enlazarla con el 'bindingsource' Dim Tabla As New DataTable Adaptador.Fill(Tabla) ObjDataGrid.DataSource = EnlaceTabla EnlaceTabla.DataSource = Tabla Catch ex As OleDb.OleDbException MsgBox(ex.Message, MsgBoxStyle.Information) End Try End Sub El enlace de los datos se realiza directamente tambin mediante la propiedad DataSource. ' Se enlaza el objeto ObjDataGrid.DataSource = Tabla

1.2.2 Carga de datos.

A la hora de la visualizacin se puede crear el siguiente cdigo para formatear en contenido o color las columnas. Private Sub ObjDataGrid_CellFormatting( _ ByVal sender As Object, _ ByVal e As System.Windows.Forms.DataGridViewCellFormattingEventArgs) _ Handles ObjDataGrid.CellFormatting Select Case e.ColumnIndex Case 0 Fecha e.Value = Strings.Right(e.Value.ToString, 2) & "-" & _ Strings.Mid(e.Value.ToString, 5, 2) & "-" & _ Strings.Left(e.Value.ToString, 4) Case 5 Entradas o salidas If e.Value IsNot Nothing Then If e.Value.ToString = "1 Then TipoMovim = "E" If e.Value.ToString = "2" Then TipoMovim = "S" Select Case e.Value.ToString Case "1" e.Value = "Compra" e.CellStyle.SelectionForeColor = Color.Blue e.CellStyle.ForeColor = Color.Blue Case "2" e.Value = "Venta" e.CellStyle.SelectionForeColor = Color.Red e.CellStyle.ForeColor = Color.Red Case "3" e.Value = "Abono" e.CellStyle.SelectionForeColor = Color.Blue e.CellStyle.ForeColor = Color.Blue Case "4" e.Value = "Devol" e.CellStyle.SelectionForeColor = Color.Red e.CellStyle.ForeColor = Color.Red End Select End If Case 6 If e.Value IsNot Nothing Then Select Case TipoMovim Case "S" e.CellStyle.SelectionForeColor = Color.Red e.CellStyle.ForeColor = Color.Red Case "E" e.CellStyle.SelectionForeColor = Color.Blue e.CellStyle.ForeColor = Color.Blue End Select End If End Select End Sub

1.2.3 Visualizacin.

1.2.4 Validacin.

A la hora del control de los datos en el evento CellValidating se puede desarrollar cdigo de control. La forma de identificar la columna objeto del control es con la propiedad ColumnIndex del objeto e. Select Case e.ColumnIndex Case 0 Si deseamos saber si el valor de la celda es nulo If String.IsNullOrEmpty(e.FormattedValue.ToString()) Then Si deseamos saber la longitud de un dato. If e.FormattedValue.ToString().Length > 2 Then Si deseamos el valor de un dato If e.FormattedValue.ToString() = "1 Then TipoMovim = "E" Private Sub ObjDataGrid_CellValidating( _ ByVal sender As Object, _ ByVal e As System.Windows.Forms.DataGridViewCellValidatingEventArgs) Handles ObjDataGrid.CellValidating Dim Celda As DataGridViewCell If ObjDataGrid.Rows(e.RowIndex).IsNewRow Then Return Celda = ObjDataGrid.Item(ObjDataGrid.CurrentCellAddress.X, _ ObjDataGrid.CurrentCellAddress.Y) Select Case e.ColumnIndex Case 0 If String.IsNullOrEmpty(e.FormattedValue.ToString()) Then MsgBox("No puede quedar en blanco.", MsgBoxStyle.Information, NomProgram) e.Cancel = True Else If e.FormattedValue.ToString().Length > 2 Then MsgBox("El cdigo excede de la longitud.", _ MsgBoxStyle.Information, NomProgram) e.Cancel = True End If End If Case 1 If String.IsNullOrEmpty(e.FormattedValue.ToString()) Then MsgBox("No puede quedar en blanco.", MsgBoxStyle.Information, NomProgram) e.Cancel = True End If End Select End Sub Con e.Cancel a true se cancela la accin.

El procedimiento que sigue realiza la configuracin en columnas del DataGrid cuando ste no captura su estructura desde el enlace con un DataTable. Los pasos son indicar el nmero de columnas que tendr el objeto ObjDataGrid.ColumnCount = 4 su nombre de columna, Name, y su ttulo, HeaderText. ObjDataGrid.Columns.Item(0).Name = "Tipo" ObjDataGrid.Columns.Item(0).HeaderText = "Tipo" Las filas que procedan le asignaremos tambin la alineacin adecuada. ObjDataGrid.Columns.Item(3).DefaultCellStyle.Alignment = _ DataGridViewContentAlignment.MiddleRight luego asignar a cada una el ancho pertinente. ObjDataGrid.Columns(0).Width = CInt(ObjDataGrid.Width * 0.1) El procedimiento completo es. Private Sub ConfigurarDataGrid(ByVal EnlaceTabla As BindingSource) ' ' El objeto es un DataGridView ' ObjDataGrid.ColumnCount = 4 ObjDataGrid.Columns.Item(0).Name = "Tipo" ObjDataGrid.Columns.Item(0).HeaderText = "Tipo" ObjDataGrid.Columns.Item(1).Name = "Codigo" ObjDataGrid.Columns.Item(1).HeaderText = "Cdigo" ObjDataGrid.Columns.Item(2).Name = "Titulo" ObjDataGrid.Columns.Item(2).HeaderText = "Ttulo" ObjDataGrid.Columns.Item(3).Name = "Cantidad" ObjDataGrid.Columns.Item(3).HeaderText = "Cantidad" ObjDataGrid.Columns.Item(3).DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight ObjDataGrid.Columns(0).Width ObjDataGrid.Columns(1).Width ObjDataGrid.Columns(2).Width ObjDataGrid.Columns(3).Width End Sub = = = = CInt(ObjDataGrid.Width CInt(ObjDataGrid.Width CInt(ObjDataGrid.Width CInt(ObjDataGrid.Width * * * *

1.2.5 Crear las columnas sin estar enlazado.

_ 0.1) 0.1) 0.6) 0.1)

En el procedimiento se puede usar al acabar una llamada a un procedimiento de configuracin genrico.

Aadir filas en un Datagrid es una accin que est supeditada al valor de las propiedades de disponibilidad de edicin ObjDataGrid.AllowUserToAddRows = Estado ObjDataGrid.AllowUserToDeleteRows = Estado ObjDataGrid.AllowUserToOrderColumns = Estado las cuales son las que marcan como responder el objeto ante esta situacin y gestionndose desde dicho objeto. Cuando la tabla est enlazada a una tabla y se permite la edicin, los datos que se aaden o se borran en el DataGrid se reflejan en la tabla. La adicin de un registro al objeto se realiza a travs de la tabla a la que est enlazado. Creamos un objeto DataRow, al que asignaremos los datos del registro de la tabla. Posteriormente el objeto DataRow se aade a la tabla y el DataGrid visualiza su contenido. Creamos el objeto, usamos el mtodo NewRow, el cual nos devuelve un registro vaco con la estructura de la tabla. Dim Registro As DataRow = Tabla.NewRow Asignar los datos al registro que hemos creado. Registro.Item("Tipo") = Titulo.Codigo.ToString Registro.Item("Codigo") = Titulo.Codig2.ToString Despus de haber asignado los datos, aadir el registro a la tabla. Tabla.Rows.Add(Registro) El cdigo completo es el que sigue. Private Sub AnyadirTitulos(ByRef Tabla as System.Data.DataTable) Dim Registro As DataRow = Tabla.NewRow Dim Titulo As ItemLista = CType(Lista04.SelectedItem, ItemLista) Dim RegTit As System.Data.DataRow Registro.Item("Tipo") = Titulo.Codigo.ToString Registro.Item("Codigo") = Titulo.Codig2.ToString Registro.Item("Titulo") = Titulo.ToString Registro.Item("Cantidad") = "0" Registro.Item("Precio") = Titulo.Codig3 Try Tabla.Rows.Add(Registro) Catch ex As ConstraintException MsgBox("Ttulo existente", MsgBoxStyle.Critical, NomProgram) End Try End Sub

1.2.6 Adicin de una fila cuando el DataGrid est enlazado.

1.2.7 Actualizar el contenido del DataGrid cuando est enlazado.


El enlace debe realizarse a travs de un BindingSource. Adaptador.Update(CType(Enlace.DataSource, DataTable)) MsgBox("Datos actualizados", MsgBoxStyle.Information) Cuando se hace de forma directa la actualizacin es. Adaptador.Update(Tabla) MsgBox("Datos actualizados", MsgBoxStyle.Information)

Recordar la configuracin de las propiedades de edicin a su valor adecuado a lo que deseemos realizar. Se desactivan si es necesario esas propiedades. En el ejemplo se han definido y cargado con datos las variables tipo, cod, denom y cant, para posteriormente usarlas en la declaracin e inicializacin del objeto fila que despus se aade al objeto ObjDataGrid. Private Sub AnyadirTituloDatagrid() ObjDataGrid.AllowUserToAddRows = True Dim Tipo, Cod, Denom As String Tipo = "01" Cod = "0001" Denom = "Visual Basic Net 2005" Dim Fila() As Object = {Tipo, Cod, Denom} ObjDataGrid.AllowUserToAddRows = True Try ObjDataGrid.Rows.Add(Fila) ' deja por no estar enlazada a datos Catch ex As ArgumentException MsgBox(ex.Message, MsgBoxStyle.Information, NomProgram) End Try ObjDataGrid.AllowUserToAddRows = False ObjDataGrid.CurrentCell = ObjDataGrid(3, ObjDataGrid.Rows.Count - 1) End Sub A continuacin se posiciona el cursor en la columna tres de la fila aadida para completar los datos manualmente. ObjDataGrid.CurrentCell = ObjDataGrid(3, ObjDataGrid.Rows.Count - 1)

1.2.8 Adicin de una fila cuando el DataGrid no est enlazado.

1.2.9 Borrado de una fila cuando el DataGrid est enlazado.


Es tan sencillo como ejecutar el cdigo del ejemplo. ObjDataGrid.Rows.Remove(ObjDataGrid.CurrentRow) CurrentRow devuelve la fila actual que es la que se borra al presionar en un button por ejemplo. La documentacin de ste objeto la podemos encontrar en : http://msdn2.microsoft.com/es-es/library/system.windows.forms.datagridview(VS.80).aspx

Es uno de los objetos que se pueden utilizar para la visualizacin y captura de los datos de una tabla. Para poder conseguir que se visualicen los datos de una la tabla en el TextBox, hay que enlazarlo antes con el origen de datos a travs de un BindingSource. El enlace se realiza con la propiedad DataBinding. Private Sub Enlaces() Campo00.DataBindings.Add("Text", EnlaceTabla, "CodProv") Campo01.DataBindings.Add("Text", EnlaceTabla, "DenomCas") Campo02.DataBindings.Add("Text", EnlaceTabla, "DenomVal") End Sub Los parmetros son ("Text", La propiedad que se va a enlazar, entre comillas, EnlaceTabla, El objeto que se enlaza al TextBox, el que tiene los datos. "CodProv") El nombre del campo en el objeto de origen de los datos, nombre en la tabla. El funcionamiento del BindingSource esta documentado en un tema anterior. La visualizacin de su contenido a partir de aqu se realiza de forma automtica, sin necesidad de realizar ninguna asignacin manual, aunque la diferencia entre un formato y otro no tiene mucha diferencia en volumen de cdigo. La carga de los datos en la tabla correspondiente sera esta. Private Sub CargaDatos() If Conexion.State = ConnectionState.Closed Then Conexion.Open() Adaptador = New OleDb.OleDbDataAdapter(CadenaSql, Conexion) Adaptador.Fill(Tabla) EnlaceTabla.DataSource = Tabla Actualizador = New OleDb.OleDbCommandBuilder(Adaptador) Conexion.Close() End Sub La actualizacin de los datos que hay en el TextBox se hace como sigue: Private Sub Actualizar() Conexion.Open() Try Adaptador.Update(CType(EnlaceTabla.DataSource, DataTable)) MsgBox("Datos actualizados.", MsgBoxStyle.Information, Me.Text) Catch ex As OleDb.OleDbException MsgBox("Datos existentes", MsgBoxStyle.Critical, Me.Text) End Try Conexion.Close() Actualizado = True End Sub El destino del enlace de los textbox al objeto BindingSource es poder obtener estas acciones.

1.3 TextBox, caja de texto.

Private Sub Comando00_Click(ByVal sender As Object, _ ByVal e As System.EventArgs) _ Handles Comando01.Click, _ Comando02.Click, _ Comando03.Click, _ Comando04.Click, _ Comando05.Click, _ Comando06.Click, _ Comando07.Click, _ Comando08.Click, _ Comando09.Click Dim Cual As Integer Cual = CInt(Strings.Right(CType(sender, Button).Name, 2)) Select Case Cual Case 1 ' cancelar EnlaceTabla.CancelEdit() Case 2 ' borrar EnlaceTabla.RemoveCurrent() Case 3 ' salida Salida() Case 4 ' principio EnlaceTabla.MoveFirst() Case 5 ' anterior EnlaceTabla.MovePrevious() Case 6 ' siguiente EnlaceTabla.MoveNext() Case 7 ' final EnlaceTabla.MoveLast() Case 8 ' nuevo EnlaceTabla.AddNew() Case 9 'actualizar EnlaceTabla.EndEdit() Actualizar() End Select End Sub Dentro de un formulario que podra tener esa apariencia. Y solo queda que en el Load del formulario se ejecute la configuracin de la conexin, la llamada al procedimiento de enlazar y la carga de los datos. Con tan poco cdigo, queda algo muy aparente, a falta de realizar las validaciones adecuadas segn el programa. El contenido de la documentacin de ste objeto podemos encontrarlo en: http://msdn2.microsoft.com/es-es/library/system.windows.forms.textbox(VS.80).aspx

1.4 ListBox.
El enlace del objeto ListBox se realiza de la siguiente forma ListBox.DataSource = ObjDataSet.Tables("TipoCliente") Realiza el enlace con la tabla del DataSet. ListBox.DisplayMember = "Denom"

Indica cual es el campo de la tabla en la parte visible del ListBox ListBox.ValueMember = "Codigo" Indica cual es el campo de la tabla que se utilizar como cdigo del dato visualizado. Codigo = ListBox.SelectedValue.ToString() Se captura, en el evento clic, por ejemplo, el valor del cdigo del elemento seleccionado. El ComboBox funciona con la misma filosofa. Es un objeto que dispone tambin de muchas opciones de visualizacin de datos. Dada su flexibilidad, la configuracin de las propiedades que determinan la forma en la que se visualiza los datos, de ah la precaucin que hay que tener a la hora de asignar los valores a las mismas, pues en funcin de su valor se pueden provocar errores motivados por la incongruencia de la configuracin. La propiedad View con el valor Details es la que marca muchas de esas propiedades de visualizacin. Esta propiedad dispone de cuatro valores posibles que cambiarn el formato de la visualizacin de los

1.5 ListView, lista.

datos.

Los mtodos BeginUpdate y EndUpdate permiten mejorar el rendimiento cuando se agregan muchos elementos a un control ListView, impidiendo que se vuelva a dibujar el control cada vez que se agrega un elemento. Si la propiedad LabelEdit est establecida en true, se pueden realizar tareas como la validacin del texto editado antes y despus de cambiarlo mediante la creacin de un controlador de eventos para los eventos BeforeLabelEdit y AfterLabelEdit. datos. A continuacin exponemos un ejemplo de cmo cargar un objeto listview desde una tabla de la base de El procedimiento es muy parecido a otros ya expuestos, y comentamos la parte que efecta la carga. Con esta declaracin creamos un objeto fila como elemento de un ListView, que despus se aadir al objeto. Dim Fila As ListViewItem Para poder cargar correctamente el ListView es necesario que ste tenga definida la cabecera, para ello utilizamos el mtodo GetName del objeto DataReader. ' Carga cabecera, sin la cabecera no funciona For I = 0 To Lector.FieldCount - 1 ListView.Columns.Add(Lector.GetName(I)) Next Ahora hay que ir creando los objetos fila para cargarlos y aadirlos despus. ' crea un nuevo elemento de lista Fila = New ListViewItem ' aade los datos Fila.Text = CStr(Lector.Item(0))

For I = 1 To Lector.FieldCount - 1 ' aade los sub elementos Fila.SubItems.Add(Lector.Item(I).ToString) Next Y cuando tenemos la fila montada la aadimos al objeto ListView. ListView.Items.Add(Fila) Todo completo. Private Sub CargaListView() Dim Conexion As New System.Data.OleDb.OleDbConnection Dim Comando As New System.Data.OleDb.OleDbCommand Dim Lector As System.Data.OleDb.OleDbDataReader Dim Fila As ListViewItem Dim I As Integer ' Configurar el comando a ejecutar, una consulta almacenada ' en el archivo de la base de datos Access, Nombre.MDB Comando.CommandText = "Usp_SelectProvincias" ' Tipo de comando a ejecutar Comando.CommandType = CommandType.StoredProcedure ' Conexin a utilizar, configurada previamente. Comando.Connection = Conexion ' Abrir la base de datos. ConfigConexion(Conexion) Conexion.Open() ' Ejecutar el comando, con un DataReader Lector = Comando.ExecuteReader ' Hay registros ??? If Lector.HasRows Then ' Carga cabecera, sin la cabecera no funciona For I = 0 To Lector.FieldCount - 1 ListView.Columns.Add(Lector.GetName(I)) Next ' recorre todas las filas While Lector.Read() ' crea un nuevo elemento de lista Fila = New ListViewItem ' aade los datos Fila.Text = CStr(Lector.Item(0)) For I = 1 To Lector.FieldCount - 1 ' aade los sub elementos Fila.SubItems.Add(Lector.Item(I).ToString) Next ListView.Items.Add(Fila) End While End If Lector.Close() ' Liberar recursos Lector = Nothing Comando.Dispose() Comando = Nothing Conexion.Dispose() Conexion = Nothing End Sub

Si deseamos obtener el cdigo del elemento que se seleccione en el ListView podemos hacer esto. CargaRegistro(ListView.SelectedItems.Item(0).Text) Donde ListView.SelectedItems.Item(0).Text se convierte en un string, que recibe el procedimiento en cuestin para cargarlo desde la base de datos, o un DataSet, partiendo de que el cdigo se ha almacenado en la columna 0. El contenido de la documentacin de ste objeto podemos encontrarlo en: http://msdn2.microsoft.com/es-es/library/system.windows.forms.listview(VS.80).aspx

1.6 TreeView, rbol.


Este objeto es prctico, o sea se, es un objeto de efectos especiales, dado que lo que se puede obtener con l se puede obtener con otros objetos, pero claro de forma menos vistosa. Como explicacin de cual es, la mejor, el explorador de Windows. A la hora de cargarlo con datos, el peligro radica cuando al realizar la carga en el primer nivel, -y en los dems-, el volumen de estos es muy elevado, en la SQL hay que limitar el nmero de registros a cargar, ya que si no se podra dar la circunstancia, de haber cargado a lo mejor un elevado volumen de datos, para visualizar un nico dato, lo cual en tiempo puede no ser rentable. Cada uno de los nodos del rbol es un objeto, del tipo TreeNode, el cual a su vez incluye una coleccin de nodos, que pueden o no ya ser nodos raz. Es importante tener claro que cada nodo es un objeto TreeNode, porque a la hora de gestionar los eventos, se realiza sobre este objeto TreeNode. El nodo actual sera Node del objeto e del evento correspondiente. e.Node Si quisiramos saber cual es el nivel del nodo en el que han hecho clic, podemos utilizar, e.Node.Level Esta propiedad es prctica porque as podemos saber el nivel del rbol en que est colocado el usuario y saber si hemos de cargar Clientes o Facturas, por ejemplo. Si necesitamos saber cual de los nodos ha recibido el clic, podemos utilizar e.Node.Index Si necesitamos informacin del nodo padre del nodo actual, podemos utilizar e.Node.Parent Este se puede anidar, o se puede retroceder lo que necesitemos en funcin del nivel en el que estemos. e.Node.Parent.Parent.Tag.ToString e.Node.Parent.Parent.Name Hay mtodos que nos permiten obtener el nodo raz del nodo actual o el nodo hijo del nodo actual, pero evidentemente para eso tenemos que haber cargado el objeto con datos.

1.6.1 Introduccin.

El evento en el que se puede activar la carga del TreView, en funcin del criterio que se elija, es el Node_MouseClick. En el ejemplo que veremos el rbol tiene cuatro niveles, tres en forma de rbol y uno con un ListView. Las variables para la captura de los datos del nodo, no son imprescindibles, es por cuestin de claridad del ejemplo. Dim Codigo As String Captura del nivel del rbol en el que est el nodo que recibe el clic. Select Case e.Node.Level Captura del dato cdigo en el nodo que se ha hecho clic, en la propiedad Name, quizs no sea muy afortunado el nombre de la propiedad, pues induce a errores. Codigo = e.Node.Name Con el dato capturado ya se puede proceder a la ejecucin del procedimiento de llenado del nodo actual, e.node. CargaNodoClientes(Codigo, e.Node) Si el dato que tenemos que cargar se compone del cdigo de un nodo anterior al actual, la captura del cdigo del nodo anterior se hace como sigue, Parent es el nodo padre del actual. Tipo = e.Node.Parent.Name Y el cdigo del actual igual que en ejemplo anterior. Codigo = e.Node.Name Para despus pasar a cargar el nuevo nodo. CargaNodoFacturas(Tipo, Codigo, e.Node) Y el evento completo a continuacin, Private Sub Arbol_NodeMouseClick( _ ByVal sender As Object, _ ByVal e As System.Windows.Forms.TreeNodeMouseClickEventArgs) _ Handles Arbol.NodeMouseClick Dim Tipo As String Dim Codigo As String Select Case e.Node.Level Case 0 Codigo = e.Node.Name CargaNodoClientes(Codigo, e.Node) Case 1 Tipo = e.Node.Parent.Name Codigo = e.Node.Name CargaNodoFacturas(Tipo, Codigo, e.Node) Case 2 Codigo = e.Node.Name CargaListView(Codigo) End Select End Sub

1.6.2 Carga.

A continuacin la carga inicial, en la que el TreeView estara vaco. En las cargas hemos utilizado un Reader, que se supone ms rpido que un DataTable. En la sintaxis de la SQL, faltara la limitacin del volumen de registros a cargar. En cuanto al funcionamiento del cdigo es el siguiente. Primero para agilizar la carga de datos en el TreeView, se desactiva la reposicin de imagen. ' Impedir que se redibuje el objeto. Arbol.BeginUpdate() Vaciamos el objeto de un posible contenido ' Limpiar el contenido del objeto. Arbol.Nodes.Clear() Generacin de los datos. CadenaSQL = "Select Codigo, Denom " & _ "From TipoCliente " & _ "Order By Denom" Try ' Abrir la base de datos. Conexion.Open() ' Contenido del comando Comando.CommandText = CadenaSQL ' Tipo de comando a ejecutar Comando.CommandType = CommandType.Text ' Conexin a utilizar, configurada previamente. Comando.Connection = Conexion ' Ejecucin de SQL Reader = Comando.ExecuteReader El siguiente paso es la ejecucin del bucle de carga de los datos, y crear un nodo con datos. ' Aadir los nodos raz para cada tipo de cliente Arbol.Nodes.Add(Reader.Item("Codigo").ToString,Reader.Item("Denom").ToString) El primer parmetro del mtodo Add es la parte que nos servir despus en el evento clic, Arbol.Nodes.Add(Reader.Item("Codigo").ToString, para la captura de la parte del cdigo del nodo. Codigo = e.Node.Name CargaNodoClientes(Codigo, e.Node) La segunda parte del evento es el texto que se ver en el rbol. ,Reader.Item("Denom").ToString) Todo esto, puede enriquecerse con iconos en los nodos. Para ello se crea un objeto ImageList, y las imgenes que se cargan en dicho objeto se asignan a las propiedades ImageIndex y SelectedImageIndex los ndices de las imgenes correspondientes. El cdigo completo de la carga es el que sigue.

Private Sub CargaArbol(ByRef Arbol as TreeView) Dim CadenaSQL As String Dim Comando As New System.Data.OleDb.OleDbCommand Dim Reader As System.Data.OleDb.OleDbDataReader ' Impedir la reposicin de imagen para agilizar el llenado Arbol.BeginUpdate() ' Limpiar el contenido del objeto Arbol.Nodes.Clear() CadenaSQL = "Select Codigo, Denom " & _ "From TipoCliente " & _ "Order By Denom" Try ' Abrir la base de datos. Conexion.Open() ' Contenido del comando Comando.CommandText = CadenaSQL ' Tipo de comando a ejecutar Comando.CommandType = CommandType.Text ' Conexin a utilizar, configurada previamente. Comando.Connection = Conexion ' Ejecucin de SQL Reader = Comando.ExecuteReader Try While Reader.Read ' Aadir los nodos raz para cada tipo de cliente Arbol.Nodes.Add(Reader.Item("Codigo").ToString, _ Reader.Item("Denom").ToString) Arbol.Nodes.Item(Arbol.Nodes.Count - 1).Tag = _ Reader.Item("Codigo").ToString End While ' Expandir el nodo creado Arbol.Nodes.Item(1).Toggle() ' Expand() Catch ex As OleDb.OleDbException MsgBox(ex.Message, MsgBoxStyle.Information, "Leer reader") End Try Catch Ex As OleDb.OleDbException MsgBox(Ex.Message, MsgBoxStyle.Information, "Crear reader") End Try Conexion.Close() ' Fin de impedir redibujar TreeView. Arbol.EndUpdate() End Sub Esta sera la carga inicial del rbol, la carga de un nodo es idntica lo que sucede es que en lugar de recibirse como objeto un TreeView, el rbol, se recibe el nodo al cual se le aaden los datos.

En el ejemplo se recibe un objeto TreeView y un objeto nodo, todo es cuestin de diseo. Private Sub CargaNodoClientes(ByVal Tipo As String, _ ByRef Arbol As TreeView, _ ByRef Nodo As TreeNode) Dim CadenaSQL As String Dim Comando As New System.Data.OleDb.OleDbCommand Dim Reader As System.Data.OleDb.OleDbDataReader ' Impedir que se redibuje el objeto. Arbol.BeginUpdate() CadenaSQL = "Select Tipo, Codigo, RazonSocial " & _ "From Clientes " & _ "Where Tipo = '" & Tipo & "' " & _ "Order By RazonSocial" Try ' Abrir la base de datos. Conexion.Open() ' Contenido del comando Comando.CommandText = CadenaSQL ' Tipo de comnndo a ejcutar Comando.CommandType = CommandType.Text ' Conexin a utilizar, configurada previamente. Comando.Connection = Conexion ' Ejecucin de SQL Reader = Comando.ExecuteReader ' Limpiar el contenido del objeto Nodo.Nodes.Clear() Try While Reader.Read ' Aadir los nodos nivel cliente para cada tipo de cliente Nodo.Nodes.Add(Reader.Item("Codigo").ToString, _ Reader.Item("RazonSocial").ToString) End While ' Expandir o contraer el nodo creado Nodo.Toggle() Catch ex As OleDb.OleDbException MsgBox(ex.Message, MsgBoxStyle.Information, "Leer reader") End Try Catch Ex As OleDb.OleDbException MsgBox(Ex.Message, MsgBoxStyle.Information, "Crear reader") End Try Conexion.Close() ' Fin de impedir redibujar TreeView. Arbol.EndUpdate() End Sub La otra posibilidad de carga, es la de utilizar un objeto ListView como complemento al TreeView, visto en el apartado anterior. Y todo puede mejorarse si utilizamos un contenedor, SplitContainer, para el TreeView y el ListView, de forma que le asignemos la parte izquierda del Split al TreeView y la derecha al ListView. En ambos objetos, TreeView y ListView, le asignamos a la propiedad Dock el valor Fill, que har que se acoplen al tamao del Split. De esa forma cuando se ajuste con el ratn la barra vertical central del Split, estos objetos se ajustarn en sus medidas para llenar toda el rea visible del mismo, como el explorador de Windows.

El objeto TreeView permite que se pueda ver las casillas de expansin a la izquierda del nodo o no, igual que las lneas que unen los nodos en funcin del valor de las propiedades. Private Sub ConfigArbol() Arbol.ShowLines = True Arbol.ShowPlusMinus = True Arbol.LabelEdit = False Arbol.ShowRootLines = True End Sub ' ' ' ' visualiza las lneas del arbol visualiza el + y - en el nodo impide editar la etiqueta del nodo une con una lnea los nodos raz

1.6.3 Configuracin.

La configuracin del objeto depender mucho del uso que se quiera hacer de l, y del destino que le vamos a dar. Si deseamos o no incorporar iconos en los nodos, en funcin del contenido, si deseamos utilizar la opcin de checkbox que incorpora, si deseamos o no permitir la edicin. TreeNode. Representa un nodo de TreeView. Como cada TreeNode puede contener una coleccin de otros objetos TreeNode, puede ser difcil determinar la ubicacin en la estructura de rbol cuando se recorre la coleccin en iteracin. Ejemplo: TreeNode nodo = new TreeNode(); TreeNode.Nodes. Obtiene la coleccin de nodos de rbol asignados al control de vista de rbol. La propiedad Nodes contiene una coleccin de objetos TreeNode, cada uno de los cuales tiene una propiedad Nodes que puede contener su propia TreeNodeCollection. TreeNodeCollection.Add Permite agregar un nuevo nodo de rbol a la coleccin, conviene mirar la sobrecarga de dicho mtodo para utilizar la ms adecuada. La utilizada en el ejemplo es adecuada para la opcin que se ha elegido, que es la de guardar el cdigo del elemento mostrado para su posterior, utilizacin. Pero disponemos tambin de la propiedad Tag, que es muy flexible, un cajn de sastre, y con ella se pueden resolver muchos problemas. TreeNodeCollection.Clear Quita todos los nodos de rbol de la coleccin. TreeNode.ExpandAll Expande todos los nodos de rbol secundarios. El mtodo ExpandAll expande todos los nodos de rbol secundarios asignados a la coleccin de Nodes, Toogle, tambin realiza una tarea similar. Nodo.Nodes.Index. Devuelve el ndice del nodo en el nodo actual, Nodo. Nodo.Nodes.Item(X). Devuelve un item del nodo actual, debe de ser menor que Count . Existen los mtodos NextNode, PrevNode para recorrer el Nodo actual, progresin de Index. FirstNode y LastNode, que se posicionan al principio y al final respectivamente del nodo secundario del nodo actual. Selected nos permite seleccionar el nodo actual. En los eventos siempre se trabaja con un objeto Nodo, independientemente de la profundidad a la que estemos actuando, y conviene tener siempre su nivel presente, para saber donde estamos y como debemos actuar.

1.6.4 Algunos conceptos.

La filosofa de carga ya se ha comentado al principio y de ella depende como se trabaje despus sobre dicho objeto. Hay que tener presente que algunas acciones no tienen sentido si el rbol no est cargado, y tambin que a lo mejor no tiene sentido cargar un rbol con mucho volumen de datos. Parte de lo que se obtiene con ste objeto se puede hacer tambin con un DataGrid, sobre todo a nivel de relaciones, pero es menos vistoso que este, y quizs menos intuitivo para los usuarios menos avezados.

1.6.5 Recorrer un rbol.

Podemos recorrer el contenido de un rbol con el siguiente ejemplo, de forma recursiva. Private Sub Recursivo(ByVal n As TreeNode) MessageBox.Show(Nodo & n.Text) Dim Nodo As TreeNode For Each Nodo In n.Nodes Recursivo(Nodo) Next End Sub Todo lo referente a ste objeto podemos encontrarlo en : http://msdn2.microsoft.com/es-es/library/system.windows.forms.treeview(VS.80).aspx http://msdn2.microsoft.com/es-es/library/system.windows.forms.treeview_members(VS.80).aspx

También podría gustarte