Ir al contenido principal

Personalizar DataGridView (III) - Cambiar Diseñador.

Articulos anteriores:
Personalizar DataGridView (I) - Pintar área vacía.
Personalizar DataGridView (II) - Bloquear columnas de solo lectura.
Personalizar DataGridView (II.1) - Saltar columna usando un metodo.

Como ya hemos visto en los artículos anteriores sobre este mismo tema, ahora lo que haré es modificar el diseñador de este control.

¿Con que objetivo?
Bien... este es un control que se suele usar mucho en los desarrollos, para mostrar muchos registros de forma vertical, pero en lo personal, cuando tengo más de 6 columnas en este control y necesito modificar una o dos columnas, cualquiera de sus propiedades, se me olvida que no puedo con un simple "click" sobre el encabezado de la columna seleccionar esta para poderla modificar, para esto tengo que usar el editor de la colección "Columns", que no digo que este mal.

pero!!!!... porque este control no implementa esta funcionalidad que vendría a ser de mucha utilidad, bueno!!!!... desde mi punto de vista.

veamos un posible caso de tantos.

Caso #1:
Tienes este control con unas 15 columnas y necesitas modificar el ancho de la columna 10 y no la puedes ver porque en el diseñador solo puedes ver las primeras 8 columnas, tienes que buscar la propiedad "Columns" para abrir su editor para poder modificar esta propiedad.

si pudieras usar la barra de desplazamiento en tiempo de diseño y solo seleccionar la columna que queremos como si fuera otro control más, seria mucho mejor este control, o ¿Me equivoco? controles de terceros lo pueden hacer, no mencionare ninguno.

Pero, gracias Microsoft por haber creado este control tan potente y flexible, y proveernos las clases necesarias para poder cambiar la funcionalidad de este control.

Así es, le daremos esta funcionalidad a nuestro control que hemos estado personalizando.

Para esto reemplazare el diseñador del control.

[C#]
 
[Designer(typeof(MEPDataGridViewDesigner), typeof(IDesigner))]
public class MEPDataGridView : DataGridView
{
}
 
internal class MEPDataGridViewDesigner : ControlDesigner
{
}
 
Al cambiar el diseñador del control nos vemos obligados a proveer un nuevo "Smart Tag".




como podemos notar en la imagen, ademas hemos agregado dos propiedades más al "Smart Tag", "Fill Empty Area" y "Enable Focus Read-Only Columns", propiedades que hemos agregado a nuestro control en los artículos anteriores.

bien, para implementar nuestra nueva funcionalidad al control he sobre escrito el metodo "WndProc" de la clase "ControlDesigner" para escuchar los mensajes "WM_RBUTTONDOWN", "WM_LBUTTONDOWN", "WM_LBUTTONUP" y "WM_RBUTTONUP", este ultimo con la idea de mostrar un menú contextual con la opción para borrar la columna al presionar el botón derecho de ratón (Mouse) sobre esta. Tal como se muestra en la siguiente imagen.


[C#]
 
internal class MEPDataGridViewDesigner : ControlDesigner
{
    [PermissionSet(SecurityAction.Demand, Name = "FullTrust")]
    protected override void WndProc(ref Message m)
    {
        switch (m.Msg)
        {
            case NativeMethods.WM_RBUTTONDOWN:
            case NativeMethods.WM_LBUTTONDOWN:
                this.WmLButtonDown(ref m);
                return;
            case NativeMethods.WM_RBUTTONUP:
                this.WmRButtonUp(ref m);
                return;
            case NativeMethods.WM_LBUTTONUP:
                this.WmLButtonUp(ref m);
                return;
        }
        base.WndProc(ref m);
    }
}
 

como también el método "OnSetCursor" y para activar la barra de desplazamiento horizontal en tiempo de diseño he sobre escrito la función "GetHitTest"

[C#]
 
internal class MEPDataGridViewDesigner : ControlDesigner

    protected override void OnSetCursor()
    {
        Point point = this.Owner.PointToClient(Control.MousePosition);
        int columnIndex = this.GetColumnIndexByPoint(point);
        if (columnIndex > -1)
            Cursor.Current = Cursors.Default;
        else
            base.OnSetCursor();
    }
    protected override bool GetHitTest(Point point)
    {
        return this.IsOverHScrollBar(point);
    }
}
 
Dando como resultado un control "DataGridView" personalizado con la funcionalidad de poder seleccionar las columnas en tiempo de diseño para poder cambiar sus propiedades o eliminar sin necesidad de usar el editor de la colección de columnas.




Descargar:
Codigo Fuente [C#]
Codigo Fuente [VB.NET] (Pendiente)

bien!!!... espero les sea de utilidad y no olviden dejar sus comentarios.


Salu2,

Comentarios

Publicar un comentario

Entradas populares de este blog

TextBox con Borde Personalizado

Bien, retomando nuevamente mi blog, luego de tanto tiempo ausente, veremos como personalizar el borde del control TextBox con un color diferente. hace poco vi en los foros de MSDN, en el foro de VB.Net esta pregunta, ¿ Cómo puedo cambiar el color del borde de un control TextBox ?, anteriormente también se hizo la misma pregunta en este mismo foro donde yo respondí como hacerlo VB2010 4.0 - Como crear un textbox personalizado . no hay manera fácil de personalizar un control, generalmente se tiene que sobre escribir el evento WndProc para escuchar los mensajes de window y reemplazar la funcionalidad de estos según sea la necesidad o el control. bien, para cambiar el color del borde del control TextBox sin mucha funcionalidad, se debe de escuchar y reemplazar el funcionamiento de los mensajes WM_PAINT y WM_NCPAINT . ¿ Porque WM_PAINT ?, porque cuando cambiamos la propiedad BorderStyle de este control a FixedSingle, quien pinta el borde es el mensaje WM_PAINT no asi el WM_NC

TextBox con Icon/Imagen

Bien, continuando con este articulo: TextBox con borde personalizado , ahora le dare la funcionalidad de poder mostrar un icono o imagen dentro del Control TextBox. Existen dos maneras de hacer esto: Pintar el icono/imagen dentro del control o Pintar el icono/imagen dentro del Non-Client Area del control. Pintar el icono/imagen dentro del control. Antes de escribir el código decidi googlear un poco, para ver si alguien más ya habia tenido la misma idea de usar el mensaje EM_SETMARGINS para dejar el espacio necesario para pintar el icono o imagen ya sea a la derecha o izquierda y me he encontrado con este articulo. Adding an Icon or Control to a TextBox or ComboBox . Pintar el icono/imagen de ntro del Non-Client Area del control. Us ando el Non- Client Area no encontre resultados googleando, así que es la forma que usar e para dib ujar un icono o imagen dentro de un control TextBox. En el control TextEditor que escrib í, utilizo esta manera para pintar el icono

Personalizar DataGridView (II) - Bloquear columnas de solo lectura

Personalizar DataGridView - Actualizaciones Personalizar DataGridView (II.1) - Bloquear columnas de solo lectura. Personalizar DataGridView (III) - Cambiar Diseñador. Bien, continuando con el articulo " Personalizar DataGridView (I) - Pintar área vacía ", ahora lo que haré es darle al control la funcionalidad de bloquear las columnas cuya propiedad " ReadOnly " se establezca en " true ", entiéndase por "Bloquear" el evitar que las columnas cuya propiedad " ReadOnly=true " puedan recibir el foco, ya sea por el teclado o por el ratón ( mouse ). Para tal objetivo agregare una nueva propiedad al control la cual llamare " AllowFocusReadOnlyColumns " cuyo valor predeterminado sera " true ", en caso de ser " false " las columnas marcadas como solo lectura no recibirán el foco. También le daré la funcionalidad de poder avanzar a la siguiente columna al presionar la tecla " ENTER " agregando otr