Personalizando el Control DataGrid

Fecha: 13/Jul/2005 (05/07/2005)
Autor: A. Percy Reyes Paredes

Blog: http://percyreyes.blogspot.com

E_mail: withoutlimits2983@hotmail.com - bigpercynet@hotmail.com

¡¡ Los peruanos SÍ podemos !!


...algo personal !!!

Hola!...nuevamente estoy con ustedes para compartirles pequeñas dosis de .NET. No quiero empezar a explicar este artículo sin mencionar algunas cosillas personales. Saben..?? la vida de un programador es muy "dramática" y, porqué no decir, "trágica".... bueno esto se debe a que un día de estos me puse a reflexionar sobre todo el tiempo que le dedicaba a .net... ok??, y como quien dicen por allí, concluí que todo sacrificio tiene su recompensa... ustedes se preguntarán ¿Cuál fue mi conclusión? y ¿cuál fue el sacrificio?... bueno mi conclusión fue que .net es la mejor alternativa en lo que se refiere a desarrollo...okk...?? y ¿por qué digo esto..?... buena pregunta... digo esto debido a que en el poco tiempo (casi un año) que me he dedicado a .net he obtenido muchos beneficios personales gracias a esta grandiosa tecnología, como por ejemplo, prestigio, trabajo, y sobre todo... he podido mejorar mi trabajo en comunidades académicas .net, ahora mi vida a cambiado mucho, creo sinceramente como desarrollador, que .net es lo mejor por ahora... sin duda... bueno, ahora se preguntarán cual fue el sacrificio..??? bueno, el sacrificio es: noches sin dormir, ojos rojos, un poco de descuido personal, no asistir a la universidad (aquí no me dictan clases de .net) y escuchar que tu novia ya NO te quiere más (debido a que ya no le das tiempo), esto si que duele... verdad..??'jejejeje... bueno... ahora dirán seguramente que exagero... pero es la pura verdad, claro que programar con todo el alma y la mente es muy satisfactorio y divertido.

La programación es cosas de locos... jejejeje... estoy aprendiendo lo que es desarrollar en .net, diría que tienes que dejarlo todo por lograr tus sueños, así que los aconsejo a dar lo mejor de ustedes..ok ???, den lo mejor, estudien mucho, no se descuiden, la vida es muy bonita como para estar haciendo una "joda" de todas las oportunidades, ... oh!! grandiosa es la vida y también es algo complicada, exagero..??? no lo sé. Ahora, les pregunto, ¿han escuchado algo, acerca de el TAO DE LA PROGRAMACIÓN ?, de no ser así, les aconsejo que investiguen al respecto, es un tema que cambio mi vida como desarrollador, en conclusión, se trata de vivir para programar, es algo loco.?? tal vez sí, pero es la escencia de un programador, ser programador o, en todo caso, desarrollador es más que escribir código eficiente, se trata de una gran cultura que llena de satisfacción y felicidad toda tu vida, ...bueno ya sabéis todo esto, espero que reflexionen al respecto, y no se olviden de realizarlo todo por amor...ok ???, ahora empecemos a explicar de que se trata este artículo.

Esta vez no detallaré mucho respecto al control datagrid, pues esto sería redundar. Tan sólo explicaré conceptos claves las cuales serán de utilidad para entender acerca de la aplicación de estilos. Si deseas obtener información más información acerca de este control, pues en la web hay de "sobra".

Fuentes de datos para el control de DataGrid

Las fuentes de datos válidos para la DataGrid incluyen:

• Clase DataTable
• Clase DataView
• Clase DataSet
• Clase DataViewManager

Si su fuente es un conjunto de datos, puede ser un objeto en el formulario o un objeto que se pasó al formulario a través de un servicio Web XML. Puede unir a los conjuntos de datos, ya sean escritos o no escritos.
Puede unir a las siguientes estructuras si sus elementos exponen propiedades públicas:
Cualquier componente que implemente la interfaz IList. Esto incluye:

• Arreglos de una sola dimensión.
• Cualquier componente que implemente la interfaz IListSource .
• Cualquier componente que implemente la interfaz IBindingList.

Un uso común del control de DataGrid es mostrar una sola tabla de datos desde un conjunto de datos. Sin embargo, también se puede utilizar el control para mostrar múltiples tablas, incluyendo tablas relacionadas. La presentación de la cuadrícula se ajusta automáticamente de acuerdo con la fuente de datos:

Tabla individual. La tabla aparece en una cuadrícula.
Tablas múltiples. La cuadrícula puede mostrar una vista de árbol en la que los usuarios pueden navegar para localizar la tabla que desean mostrar.

Cuando el control de DataGrid muestra una tabla y la propiedad AllowSorting se configura a verdadero, los datos se pueden clasificar al hacer clic en los encabezados de la columna. El usuario también puede agregar filas y editar celdas.

La relación entre un conjunto de tablas se muestra utilizando una estructura principal / secundaria de navegación. Las tablas principales son el nivel más alto de datos, y las tablas secundarias son aquellas tablas de datos que se derivan de los listados individuales en las tablas principales. Los expansores se muestran en cada fila principal que contenga una tabla secundaria. Al hacer clic en un ampliador, se genera una lista de vínculos tipo Web en las tablas secundarias, que cuando se seleccionan causan que las tablas secundarias aparezcan en pantalla. Al hacer clic en el icono "mostrar / ocultar las filas principales" ocultará la información acerca de la tabla principal (o causará que reaparezca si la ha ocultado previamente). Un botón hacia atrás permite la navegación inversa en la tabla vista previamente.

Algunas características del control de DataGrid, como colores, fuente de texto, alterar colores de fondo y propiedades de los datos, se puede formatear en el ambiente de diseño utilizando la ventana Propiedades. Están disponibles varias propiedades tales como CaptionForeColor, CaptionBackColor y CaptionFont.

Columnas y filas

Una DataGrid consiste en una colección de objetos DataGridTableStyle dentro de la propiedad TableStyles del control de DataGrid. Un estilo de tabla puede contener una colección de objetos DataGridColumnStyle incluidas en la propiedad GridColumnStyles del objeto DataGridTableStyle. Puede editar las propiedades TableStyles y ColumnStyles con editores de colección a los que se accede a través de la ventana Propiedades.

Cualquier objeto DataGridTableStyle asociado con el control de DataGrid puede ser accedido a través de GridTableStylesCollection. GridTableStylesCollection se puede editar en el diseñador con el Editor de la colección DataGridTableStyle, o de manera programática a través de la propiedad TableStyles del control de DataGrid, como se muestra en el ejemplo que se encuentra más abajo.

Los estilos de la tabla y los estilos de la columna se sincronizan con los objetos DataTable y DataColumn al establecer sus propiedades MappingName en las propiedades TableName y ColumnName apropiadas. Cuando un objeto DataGridTableStyle sin estilos de columna se agrega a una unión de control DataGrid a una fuente de datos válida, y la propiedad MappingName del estilo de la tabla se configura a una propiedad TableName válida, se crea una colección de objetos DataGridColumnStyle para ese estilo de tabla. Para cada objeto DataColumn que se encuentra en la colección Columnas del objeto DataTable, se agrega un objeto DataGridColumnStyle correspondiente al objeto GridColumnStylesCollection, al cual se accede a través de la propiedad GridColumnStyles del objeto DataGridTableStyle. Se pueden agregar o eliminar columnas de la cuadrícula utilizando el método Agregar o Eliminar en el objeto GridColumnStylesCollection.

Una colección de tipos de columna extiende la clase DataGridColumnStyle con capacidades de formateo y edición enriquecidas. Todos los tipos de columna se heredan de la clase base DataGridColumnStyle. La clase que se crea depende de la propiedad DataType del objeto DataColumn en el cual se basa DataGridColumn. Por ejemplo, un objeto DataColumn con su propiedad DataType configurada a System.Boolean se asociará con DataGridBoolColumn. La siguiente tabla describe cada uno de estos tipos de columna.

DataGridTextBoxColumn Acepta y muestra los datos como cadenas formateadas o no formateadas. Las capacidades de edición son las mismas a las que se utilizan para editar datos en un TextBox sencillo. Se hereda de DataGridColumnStyle.
DataGridBoolColumn Acepta y muestra valores verdaderos, falsos y nulos. Se hereda de DataGridColumnStyle.

 

Eventos

Aparte de los eventos de control comunes como MouseDown, Intro y Desplazar, el control de DataGrid soporta los eventos asociados con la edición y navegación dentro de la cuadrícula. La propiedad CurrentCell determina cuál celda se selecciona. El evento CurrentCellChanged surge cuando el usuario navega a una celda nueva. Cuando el usuario navega a una tabla nueva (a través de las relaciones principales / secundarias), el evento Navegar surge. El evento BackButtonClick surge cuando el usuario hace clic en el botón posterior cuando ve una tabla secundaria, y el evento ShowParentDetailsButtonClick surge cuando se hace clic en el icono "mostrar / ocultar filas principales"...ufff!!! interesantes verdad.. ?, me gustaría seguir pero ya tengo algo de sueño, le sugiero investigar al respecto, no hay remedio.

Ejemplo:

1. Para poder mostrar los datos en la tabla, primero debe unir el control de DataGrid al conjunto de datos.
2. Declare un nuevo estilo de tabla y establezca el nombre de su correlación.
3. Declare un estilo de columna nuevo y establezca el nombre de su correlación y otras propiedades.
4. Invoque el método Agregar del objeto GridColumnStylesCollection para agregar la columna al estilo de la tabla
5. Invoque el método Agregar del objeto GridTableStylesCollection para agregar el estilo de tabla a la cuadrícula de datos.

 

VB .NET

...

DataGrid1.SetDataBinding(DsCustomers1, "Clientes")
Dim tableStyle As New DataGridTableStyle
tableStyle.MappingName = "Customers"
Dim myDataCol As New DataGridBoolColumn
myDataCol.HeaderText = "My New Column"
myDataCol.MappingName = "Current"
tableStyle.GridColumnStyles.Add(myDataCol)
DataGrid1.TableStyles.Add(tableStyle)
...

 

 

C# .NET

...
dataGrid1.SetDataBinding(DsCustomers1, "Clientes");
DataGridTableStyle tableStyle = new DataGridTableStyle();
tableStyle.MappingName = "Customers";
DataGridBoolColumn myDataCol = new DataGridBoolColumn();
myDataCol.HeaderText = "My New Column";
myDataCol.MappingName = "Current";
tableStyle.GridColumnStyles.Add(myDataCol);
dataGrid1.TableStyles.Add(tableStyle);
...

Ahora veamos un ejemplo sencillo de cómo aplicar los conceptos explicados anteriormente. En este ejemplo (formatear una datagrid usando estilos) se muestra cómo poco a poco vamos creando estilos de columnas y el estilo de tabla, las cuales serán usados para formatear los datos de cada columna de nuestra datagrid. Pues ahora te dejo que revises el código.

A continuación sigue código en Visual Basic NET:

Imports System
Imports System.Drawing
Imports System.Collections
Imports System.ComponentModel
Imports System.Windows.Forms
Imports System.Data

Public Class Form1
    Inherits System.Windows.Forms.Form

    ' ...
    ' código generedo por el diseñador de windows form
    ' ...

    Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) _
        Handles MyBase.Load

        'establecemos la referencia cultural del subproceso actual Español-Perú.
        System.Threading.Thread.CurrentThread.CurrentCulture = _
        New System.Globalization.CultureInfo("es-PE")

        Dim TableName As New String("MyTable")

        Dim ObjEstiloTabla As New DataGridTableStyle
        With ObjEstiloTabla
            .MappingName = TableName
            .AlternatingBackColor = Color.Coral
            .BackColor = Color.Orange
            .ForeColor = Color.White
            .HeaderForeColor = Color.Blue
            .LinkColor = SystemColors.Control
            .AllowSorting = False
            .HeaderFont = New System.Drawing.Font("Verdana", 8.25F, _
            System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, _
            CType(1, System.Byte))
        End With

        Me.DataGrid1.TableStyles.Add(ObjEstiloTabla)
        Me.DataGrid1.DataSource = GetMyTable(TableName)

        Dim ObjEstiloColumna As DataGridTextBoxColumn

        'formateamos la columna 0 ó "Integer" para datos enteros
        ObjEstiloColumna = DataGrid1.TableStyles(0).GridColumnStyles(0)
        If Not (ObjEstiloColumna Is Nothing) Then
            ObjEstiloColumna.Format = "n1"
        End If

        'formateamos la columna 1 ó "Double" para datos de tipo double
        ObjEstiloColumna = DataGrid1.TableStyles(0).GridColumnStyles(1) '
        If Not (ObjEstiloColumna Is Nothing) Then
            ObjEstiloColumna.Format = "f3"
        End If

        'formateamos los datos de la columna anterior como moneda nacional
        '(en este caso, usaremos la moneda nacional peruana)
        ObjEstiloColumna = DataGrid1.TableStyles(0).GridColumnStyles(2) '
        If Not (ObjEstiloColumna Is Nothing) Then
            ObjEstiloColumna.Format = "c2"
        End If

        'formateamos los datos de la columna 3 ó "Date" como Date
        ObjEstiloColumna = DataGrid1.TableStyles(0).GridColumnStyles(3) '
        If Not (ObjEstiloColumna Is Nothing) Then
            ObjEstiloColumna.Format = "d"
            ObjEstiloColumna.Width = 100
        End If


    End Sub


    Private Function GetMyTable(ByVal TableName As String) As DataTable

        Dim dt As New DataTable(TableName)
        Dim RowsCount As Integer = 10

        dt.Columns.Add(New DataColumn("Integer", GetType(Integer)))
        dt.Columns.Add(New DataColumn("Double", GetType(Double)))
        dt.Columns.Add(New DataColumn("s/. Double", GetType(Double)))
            dt.Columns.Add(New DataColumn("Date", GetType(DateTime)))

            Dim r As New Random 'objeto que generará un número aleatorio
            Dim i As Integer

            While i < RowsCount
                Dim d As Double = 1000 * r.NextDouble()
                    Dim dr As DataRow = dt.NewRow()
                    dr(0) = Fix(d)
                    dr(1) = d
                    dr(2) = d
                    dr(3) = DateTime.Now.Date.AddMonths(CType(r.NextDouble * 21, Double))
                        dt.Rows.Add(dr)
                        i += 1
                    End While

                    Return dt
     End Function

   End Class
No olvides de darme tu voto en PanoramaBox, de esta manera seguiré compartiendo contigo lo que voy aprendiendo. Gracias.

Espacios de nombres usados en el código de este artículo:

System.Drawing

System.Collections

System.ComponentModel

System.Data

System.Threading

System.Globalization


Arbis Percy Reyes Paredes es peruano, tiene 21 años y se dedica a la construcción de software de manera profesional, joven desarrollador de aplicaciones Web y Servicios Web XML en VB .NET y C# .NET con bases de datos SQL Server 2000, aplicaciones basadas en Windows con VB .NET y C# .NET, VB 6.0, y controles y bibliotecas ActiveX; actualmente estudia en la Universidad Nacional de Trujillo, la carrera de Ingeniería de Sistemas. Le encanta el desarrollo de aplicaciones para dispositivos móviles tanto como la programación gráfica y programación avanzada de videojuegos.


ir al índice