Académique Documents
Professionnel Documents
Culture Documents
1.1 Introducción.
Objetos de visualización pueden ser cualquiera que nosotros queramos utilizar.
Pero aquellos más habituales en el enlace con las Bases de datos podían ser
DataGridView
TextBox ..
ListBox.
1.2 DataGridView.
Es un objeto de visualización, es una evolución 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 cuadrícula se realiza mediante la propiedad DataSource.
Cuando se realiza éste enlace no es posible añadir filas de forma manual al DataGrid.
Dispone de un sin fin de opciones de configuración para mejorar el formato de visualización.
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 configuración de dicho objeto, por cuestiones estéticas hay que destacar la
combinación de las siguientes propiedades que permiten obtener una visualización de las filas en un formato
similar al antiguo papel pijama, lo cual facilita su interpretación, solo hay que utilizar dos colores contrastados y
de tonos suaves que no impidan la legibilidad del texto.
En el apartado del teclado, quizás tenga algunas deficiencias, pero se podrían 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.
1.2.1 Configuración.
El ejemplo es un poco largo, y no todo es necesario, pero tiene un pequeño resumen de las propiedades
de configuración más relevantes.
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 selección 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
ObjDataGrid.Columns(3).DefaultCellStyle.Alignment = _
DataGridViewContentAlignment.MiddleRight
Un ejemplo podría ser éste en el que el ancho de las columnas se asignan como un porcentaje del ancho
del objeto.
If String.IsNullOrEmpty(e.FormattedValue.ToString()) Then
ObjDataGrid.ColumnCount = 4
ObjDataGrid.Columns.Item(0).Name = "Tipo"
ObjDataGrid.Columns.Item(0).HeaderText = "Tipo"
ObjDataGrid.Columns.Item(3).DefaultCellStyle.Alignment = _
DataGridViewContentAlignment.MiddleRight
ObjDataGrid.Columns.Item(1).Name = "Codigo"
ObjDataGrid.Columns.Item(1).HeaderText = "Código"
ObjDataGrid.Columns.Item(2).Name = "Titulo"
ObjDataGrid.Columns.Item(2).HeaderText = "Título"
ObjDataGrid.Columns.Item(3).Name = "Cantidad"
ObjDataGrid.Columns.Item(3).HeaderText = "Cantidad"
ObjDataGrid.Columns.Item(3).DefaultCellStyle.Alignment = _
DataGridViewContentAlignment.MiddleRight
ObjDataGrid.AllowUserToAddRows = Estado
ObjDataGrid.AllowUserToDeleteRows = Estado
ObjDataGrid.AllowUserToOrderColumns = Estado
las cuales son las que marcan como responderá el objeto ante esta situación y gestionándose desde
dicho objeto.
Cuando la tabla está enlazada a una tabla y se permite la edición, los datos que se añaden o se borran
en el DataGrid se reflejan en la tabla.
Creamos un objeto DataRow, al que asignaremos los datos del registro de la tabla.
Posteriormente el objeto DataRow se añade a la tabla y el DataGrid visualiza su contenido.
Creamos el objeto, usamos el método NewRow, el cual nos devuelve un registro vacío con la estructura
de la tabla.
Registro.Item("Tipo") = Titulo.Codigo.ToString
Registro.Item("Codigo") = Titulo.Codig2.ToString
Tabla.Rows.Add(Registro)
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("Título existente", MsgBoxStyle.Critical, NomProgram)
End Try
End Sub
1.2.7 Actualizar el contenido del DataGrid cuando está enlazado.
El enlace debe realizarse a través de un BindingSource.
Adaptador.Update(CType(Enlace.DataSource, DataTable))
MsgBox("Datos actualizados", MsgBoxStyle.Information)
Adaptador.Update(Tabla)
MsgBox("Datos actualizados", MsgBoxStyle.Information)
Tipo = "01"
Cod = "0001"
Denom = "Visual Basic Net 2005"
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 continuación se posiciona el cursor en la columna tres de la fila añadida para completar los datos
manualmente.
ObjDataGrid.Rows.Remove(ObjDataGrid.CurrentRow)
CurrentRow devuelve la fila actual que es la que se borra al presionar en un button por ejemplo.
http://msdn2.microsoft.com/es-es/library/system.windows.forms.datagridview(VS.80).aspx
1.3 TextBox, caja de texto.
Es uno de los objetos que se pueden utilizar para la visualización 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 través de un BindingSource.
El enlace se realiza con la propiedad DataBinding.
("Text",
EnlaceTabla,
"CodProv")
El destino del enlace de los textbox al objeto BindingSource es poder obtener estas acciones.
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
Y solo queda que en el Load del formulario se ejecute la configuración de la conexión, la llamada al
procedimiento de enlazar y la carga de los datos.
Con tan poco código, queda algo muy aparente, a falta de realizar las validaciones adecuadas según el
programa.
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")
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 código del dato visualizado.
Codigo = ListBox.SelectedValue.ToString()
Se captura, en el evento clic, por ejemplo, el valor del código del elemento seleccionado.
La propiedad View con el valor Details es la que marca muchas de esas propiedades de visualización.
Esta propiedad dispone de cuatro valores posibles que cambiarán el formato de la visualización de los
datos.
Los métodos 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 validación del texto
editado antes y después de cambiarlo mediante la creación de un controlador de eventos para los eventos
BeforeLabelEdit y AfterLabelEdit.
A continuación exponemos un ejemplo de cómo cargar un objeto listview desde una tabla de la base de
datos.
El procedimiento es muy parecido a otros ya expuestos, y comentamos la parte que efectúa la carga.
Con esta declaración creamos un objeto fila como elemento de un ListView, que después se añadirá al
objeto.
Para poder cargar correctamente el ListView es necesario que éste tenga definida la cabecera, para ello
utilizamos el método GetName del objeto DataReader.
Ahora hay que ir creando los objetos fila para cargarlos y añadirlos después.
ListView.Items.Add(Fila)
Todo completo.
For I = 1 To Lector.FieldCount - 1
' añade los sub elementos
Fila.SubItems.Add(Lector.Item(I).ToString)
Next
ListView.Items.Add(Fila)
End While
End If
Lector.Close()
CargaRegistro(ListView.SelectedItems.Item(0).Text)
http://msdn2.microsoft.com/es-es/library/system.windows.forms.listview(VS.80).aspx
A la hora de cargarlo con datos, el peligro radica cuando al realizar la carga en el primer nivel, -y en los
demás-, el volumen de estos es muy elevado, en la SQL hay que limitar el número de registros a cargar, ya que
si no se podría 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 colección
de nodos, que pueden o no ya ser nodos raíz.
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 sería Node del objeto “e” del evento correspondiente.
e.Node
Si quisiéramos saber cual es el nivel del nodo en el que han hecho clic, podemos utilizar,
e.Node.Level
Esta propiedad es práctica 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.
e.Node.Index
Si necesitamos información del nodo padre del nodo actual, podemos utilizar
e.Node.Parent
Este se puede anidar, o se puede retroceder lo que necesitemos en función del nivel en el que estemos.
e.Node.Parent.Parent.Tag.ToString
e.Node.Parent.Parent.Name
Hay métodos que nos permiten obtener el nodo raíz del nodo actual o el nodo hijo del nodo actual, pero
evidentemente para eso tenemos que haber cargado el objeto con datos.
1.6.2 Carga.
El evento en el que se puede activar la carga del TreView, en función 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 cuestión de claridad
del ejemplo.
Captura del nivel del árbol en el que está el nodo que recibe el clic.
Captura del dato código en el nodo que se ha hecho clic, en la propiedad Name, quizás 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 ejecución del procedimiento de llenado del nodo actual,
e.node.
CargaNodoClientes(Codigo, e.Node)
Si el dato que tenemos que cargar se compone del código de un nodo anterior al actual, la captura del
código del nodo anterior se hace como sigue, Parent es el nodo padre del actual.
Tipo = e.Node.Parent.Name
Codigo = e.Node.Name
El siguiente paso es la ejecución del bucle de carga de los datos, y crear un nodo con datos.
El primer parámetro del método Add es la parte que nos servirá después en el evento clic,
Arbol.Nodes.Add(Reader.Item("Codigo").ToString,
Codigo = e.Node.Name
CargaNodoClientes(Codigo, e.Node)
,Reader.Item("Denom").ToString)
Esta sería la carga inicial del árbol, la carga de un nodo es idéntica lo que sucede es que en lugar de
recibirse como objeto un TreeView, el árbol, se recibe el nodo al cual se le añaden los datos.
En el ejemplo se recibe un objeto TreeView y un objeto nodo, todo es cuestión de diseño.
La otra posibilidad de carga, es la de utilizar un objeto ListView como complemento al TreeView, visto en
el apartado anterior.
La configuración 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 función del contenido, si deseamos utilizar la
opción de checkbox que incorpora, si deseamos o no permitir la edición.
1.6.4 Algunos conceptos.
TreeNode.
Representa un nodo de TreeView. Como cada TreeNode puede contener una colección de otros objetos
TreeNode, puede ser difícil determinar la ubicación en la estructura de árbol cuando se recorre la colección en
iteración.
Ejemplo: TreeNode nodo = new TreeNode();
TreeNode.Nodes.
Obtiene la colección de nodos de árbol asignados al control de vista de árbol. La propiedad Nodes
contiene una colección 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 colección, conviene mirar la sobrecarga de dicho método
para utilizar la más adecuada.
La utilizada en el ejemplo es adecuada para la opción que se ha elegido, que es la de guardar el código
del elemento mostrado para su posterior, utilización.
Pero disponemos también de la propiedad Tag, que es muy flexible, un cajón de sastre, y con ella se
pueden resolver muchos problemas.
TreeNodeCollection.Clear
Quita todos los nodos de árbol de la colección.
TreeNode.ExpandAll
Expande todos los nodos de árbol secundarios. El método ExpandAll expande todos los nodos de árbol
secundarios asignados a la colección de Nodes, Toogle, también 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 métodos NextNode, PrevNode para recorrer el Nodo actual, progresión de Index.
FirstNode y LastNode, que se posicionan al principio y al final respectivamente del nodo secundario del
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.
La filosofía de carga ya se ha comentado al principio y de ella depende como se trabaje después sobre
dicho objeto.
Hay que tener presente que algunas acciones no tienen sentido si el árbol no está cargado, y también
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 también con un DataGrid, sobre todo a nivel
de relaciones, pero es menos vistoso que este, y quizás 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.
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