Colabora .NET

DataGridView personalizado

Cambiar la tecla Enter en Tab en un DataGridView

 

Fecha: 31/Oct/2006 (31/10/06)
Autores: Pep Lluis y Rafa Vargas

 


Introducción

Muchos de nosotros aprovechamos el control DataGridView como visualizador, sin embargo además puede ser una excelente ayuda para añadir nuevas filas a nuestras estructuras de datos.
 

En un proceso donde la información se estructura mediante columnas y líneas, el objetivo es introducir nuevas filas con la mayor facilidad posible, es entonces cuando nos percatamos de que por defecto el DataGridView actúa de una forma un tanto inconveniente para nuestro cometido. Cada vez que pulsamos ‘enter’ ya sea en modo ‘edición’ el efecto es que nos crea una nueva fila desplazándose acto seguido a la primera celda de la misma (como en Excel), entonces nos obliga a utilizar los cursores para reubicar el ‘foco’ a la celda donde va a continuar nuestra próxima entrada. Realmente es un inconveniente, pues nos hace perder muchísimo tiempo empleándolo en pulsaciones simplemente inútiles.
 

Dicho esto, para poder introducir datos de izquierda a derecha tal y como estamos acostumbrados en la mayoría de situaciones en la que manejamos información, podemos recurrir a varios recursos, os proponemos ver como anulando las funciones ‘ProcessDialogKey’ ‘OnKeyDown’ y rescribiendo el código para que la pulsación de una tecla ‘enter’ sea substituida por un ‘tab’ utilizando un ‘sendkeys’, pudiendo conseguir una mejora increíble en la funcionalidad. También en una segunda propuesta os introducimos a como manejar el direccionamiento de selección de las ‘celdas’ de un DataGridView capturando las pulsaciones en el ‘PreProcessMessage’, ambas heredando la funcionalidad DataGridView y añadiendo a esta personalidad propia.
 

Esperamos que os sea de utilidad… solo tenéis que ¡cortar y pegar!
 

Pep Lluis y Rafael.


El código:

 

'' (c) Pep Lluis & Rafa Vargas
'' Ambos ejemplos vienen derivados de una inquietud compartida en
'' el ultimo Code Camp del Escorial en el 2006 entre Rafa Vargas y
'' Pep Lluis... no cabe duda del lema 'Comparte y Aprenderas'.
''
Public Class Form1
    'Mi DGV, que traduce el 'Enter' en 'Tab'
    Private WithEvents _MiDGView1 As New DgvPlus
    'Mi DGV, que controla la posicion de la celda actual
    Private WithEvents _MiDGView2 As New MiDGView
    '
    ' al lanzar nuestro form (en el momento de carga)
    Private Sub Form1_Load(ByVal sender As Object, _
                ByVal e As System.EventArgs) Handles Me.Load
        '
        'Construir el primer DGV
        '
        'Acoplarlo a la izquierda
        _MiDGView1.Dock = DockStyle.Left
        'con cuatro columnas
        _MiDGView1.ColumnCount = 4
        'Ajustarlo al tamaño
        _MiDGView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill
        'Etiquetar columna
        _MiDGView1.Columns(0).HeaderText = "Caso A"
        'Añadirlo al form
        Me.Controls.Add(_MiDGView1)
        '
        'Construir el segundo DGV
        _MiDGView2.Dock = DockStyle.Right
        _MiDGView2.ColumnCount = 4
        _MiDGView2.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill
        _MiDGView2.Columns(0).HeaderText = "Caso B"
        Me.Controls.Add(_MiDGView2)
        '
        'La ventana (aspecto)
        '
        'Ajustar el ancho del form
        Me.Width = Me._MiDGView1.Width + Me._MiDGView2.Width + 25
        'Ponerle titulo
        Me.Text = "Pep/Rafa DataGridView"
    End Sub
End Class

'
' Nuestra personalizacion para MiDGView 
'---------------------------------------------------------------
'
Public Class MiDGView
    Inherits DataGridView       'Heredar del DataGridView
    '
    'Prepocesar mensajes
    Public Overrides Function PreProcessMessage( _
                ByRef msg As System.Windows.Forms.Message) As Boolean

        'Si es 'KeyDown' y 'Enter'
        If msg.Msg = 257 And msg.WParam.ToInt32 = 13 Then
            Dim MiCol As Integer = 0
            Dim MiFil As Integer = Me.CurrentCell.RowIndex - 1
            'Si noSalimos del limite
            If Me.CurrentCell.ColumnIndex < Me.ColumnCount - 1 Then
                'Siguiente columna
                MiCol = Me.CurrentCell.ColumnIndex + 1
            End If
            'Posicionar columna
            If MiFil > -1 Then Me.CurrentCell = Me(MiCol, MiFil)
        End If
        Return MyBase.PreProcessMessage(msg)
    End Function
End Class

'
' Nuestra personalizacion para DGVPlus 
'---------------------------------------------------------------
'
Public Class DgvPlus
    Inherits DataGridView   'Heredar del DataGridView

    '
    'en el 'processDialogKey'... cuando estamos en edicion
    Protected Overrides Function ProcessDialogKey( _
                ByVal keyData As System.Windows.Forms.Keys) As Boolean

        If keyData = Keys.Enter Then                'Si es 'enter'
            SendKeys.Send(Chr(Keys.Tab))            'Enviar un 'Tab'
            Return True                             'Marcar como procesado
        Else                                        'en caso contrario
            Return MyBase.ProcessDialogKey(keyData) 'devolver KeyData
        End If
    End Function
    '
    ' en 'OnKeyDown'... cuando no estamos en edicion
    Protected Overrides Sub OnKeyDown( _
                ByVal e As System.Windows.Forms.KeyEventArgs)
        If e.KeyData = Keys.Enter Then              'Si es 'enter'
            SendKeys.Send(Chr(Keys.Tab))            'Enviar un 'Tab'
        Else
            MyBase.OnKeyDown(e)                     'Devolver el KeyEventArgs
        End If
    End Sub
End Class

 


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

System.Windows.Forms

 



ir al índice principal del Guille