Ir al contenido principal

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 otra propiedad que llamare "EnterMoveNextColumn" cuyo valor predeterminado sera "true"

[C#]
 
private bool vAllowFocusReadOnlyColumns;
private bool vEnterMoveNextColumn;

[DefaultValue(true)]
public bool AllowFocusReadOnlyColumns
{
    get { return vAllowFocusReadOnlyColumns; }
    set { vAllowFocusReadOnlyColumns = value; }
}

[DefaultValue(true)]
public bool EnterMoveNextColumn
{
    get { return vEnterMoveNextColumn; }
    set { vEnterMoveNextColumns = value; }
}
 
[VB.NET]
 
Private vAllowFocusReadOnlyColumns As Boolean
Private vEnterMoveNextColumn As Boolean

<DefaultValue(True)> _
Public Property AllowFocusReadOnlyColumns() As Boolean
    Get 
        Return vAllowFocusReadOnlyColumns
    End Get
    Set (ByVal value As Boolean)
        vAllowFocusReadOnlyColumns = value
    End Set
End Property

<DefaultValue(True)> _
Public Property EnterMoveNextColumn() As Boolean
    Get
        Return vEnterMoveNextColumn
    End Get
    Set (ByVal value As Boolean)
        vEnterMoveNextColumn = value
    End Set
End Property
 
Para agregarle esta funcionalidad al control sobre escribiré el método "WndProc" para escuchar el mensaje del teclado "WM_KEYDOWN" y los mensajes del ratón (mouse) "WM_LBUTTONDBLCLK", "WM_LBUTTONDOWN" y el mensaje "WM_SETFOCUS", en caso de no permitir que las columnas marcadas como solo lectura reciban el foco, estos mensajes no serán procesados por el método base del control. 

[C#]
 
[PermissionSet(SecurityAction.Demand, Name = "FullTrust")]
protected override void WndProc(ref Message m)
{
    switch (m.Msg)
    {
        case NativeMethods.WM_SETFOCUS:
            this.WmSetFocus(ref m);
            break;
        case NativeMethods.WM_LBUTTONDBLCLK:
            this.WmLButtonDblClk(ref m);
            return;
        case NativeMethods.WM_LBUTTONDOWN:
            this.WmLButtonDown(ref m);
            return;
        case NativeMethods.WM_KEYDOWN:
            this.WmKeyDown(ref m);
            return;
    }
    base.WndProc(ref m);
}
 
[VB.NET]
 
<PermissionSet(SecurityAction.Demand, Name:="FullTrust")> _
Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
    Select Case m.Msg
        Case NativeMethods.WM_SETFOCUS
            Me.WmSetFocus(m)
        Case NativeMethods.WM_LBUTTONDBLCLK
            Me.WmLButtonDblClk(m)
            Return
        Case NativeMethods.WM_LBUTTONDOWN
            Me.WmLButtonDown(m)
            Return
        Case NativeMethods.WM_KEYDOWN
            Me.WmKeyDown(m)
            Return
    End Select

    MyBase.WndProc(m)
End Sub
 
Y a continuación los proyectos para que los descarguen.

Código fuente [C#]
Código fuente [VB.NET]

En el próximo articulo lo que haré sera agregar un evento al control para poder indicar si la columna puede recibir el foco sin necesidad de que la propiedad "ReadOnly" este establecida en "true", ya que el algunos casos no necesitamos que la celda reciba el foco pero si que pueda ser editada.

Espero sea de utilidad este articulo y no olviden dejar sus comentarios.

Salu2,

Comentarios

  1. dataGridView.Columns[0].ReadOnly = true;

    donde cero es el indice de tu columna. Suerte

    ResponderEliminar
  2. Hola me podrias dar una mano donde y como lo uso tu codigo

    ResponderEliminar
  3. Hola me podrias dar una mano, donde y como lo uso tu codigo para aplicarlo en mis datagridview

    ResponderEliminar
    Respuestas
    1. Eso dependera... recuerda que la idea es mostrar que se puede personalizar este control sin la necesidad de crear uno de cero, son ejemplos que puedes tomar y adaptar a tus necesidades
      Salu2,

      Eliminar

Publicar un comentario

Entradas populares de este blog

NetBarControl

Actualización. NetBarControl - Description Item Style ( New ) NetBarControl ( Outlook Bar ) es uno de los controles que muchas veces buscamos para usar en nuestras aplicaciones, pero siempre encontramos en internet versiones pagables y tal vez no contamos con el presupuesto esperado como para comprar uno y las versiones gratis que se logran encontrar, pues como son gratis no implementan en su totalidad la funcionalidad que esperamos encontrar en un control de este tipo. Antes de comenzar a escribir este control dedique tiempo en buscar uno por internet que tuviera toda la funcionalidad o por lo menos una interfaz disponible en modo de diseño, pero, no logre encontrar uno, así que me propuse crearlo como a mí me gustaría que funcionara uno gratis y al final llegue a la conclusión de ¿Porque no hay uno completo, gratis y que incluya el código fuente? y la respuesta es: No es fácil , pero tampoco es cosa de otro mundo. Con esto no digo que otro programador no lo pueda hacer ...

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...

TextEditor

Este control nace a raíz de una pregunta en el foro de Visual Basic .Net, sobre como cambiar el borde de un TextBox a un borde personalizado y además andaba buscando cambiar la apariencia del control NetBarControl para poder aplicarle una nueva propiedad para cambiar el estilo. ejemplo: Aun que esta imagen solo es un pre-formato de cómo funcionara el control NetBarControl, solo que me distraje creando este nuevo control TextEditor. Así que le echaré mano al terminado este nuevo control. Bien, la idea inicial era solo agregar botones a un control TextBox, pero luego usando el Mozilla, al descargar unos archivos me percate de un control en la parte inferior de esta venta de descargar, aun que se suele ver mucho en las páginas Web, pero me llamo la atención aquí en el Mozilla y en el Window Live Messenger. Entonces… me entro el gusano de la curiosidad, agregar la imagen luego de agregar los botones ya no era la parte difícil, la parte curiosa es mostrar el Texto como m...