DataGrid Personalizado
Creando un control personalizado para la captura de las teclas presionadas por el Usuario.

Fecha: 07/Nov/2004 (06/11/04)
Autor: David Sabo W. (david.sabo@gmail.com)

 


    La mayoría de las aplicaciones que desarrollamos requieren que el Control DataGrid pueda ejecutar una acción cuando presionamos una tecla, lo más común es que seleccione y procese una fila seleccionada al presionar la tecla [Enter]. Una característica que cualquier aplicación desarrollada bajo el ambiente Windows debería tener.

    Esta característica nos es soportada por el Control DataGrid del .NET Framework, sin embargo, es posible implementar esta característica realizando un pequeño UserControl, el cual explicaremos brevemente como realizarlo a continuación:

    El primer paso que debemos es crear una clase de tipo User Control. Preferiblemente en un proyecto de tipo "Windows Control Library", para que se pueda crear su respectiva dll y poder reutilizar este control en diferentes aplicaciones.

    Seguidamente cambiaremos la clase a la cual el User Control esta siendo heredada. Debemos especificar que el User Control sera heredado de un Control DataGrid, de la siguiente manera:

public class CustomGrid : System.Windows.Forms.DataGrid

    Una vez creada la clase User Control, debemos sobrescribir el método ProcessCmdKey, el cual es un método que se utiliza para capturar en un nivel más bajo que los eventos KeyUp, KeyDown y KeyPress. Este método es llamado durante el preprocesamiento de mensajes para manejar las teclas comandos. Para más información acerca del método ProcessCmdKey, haga clic aqui.

protected override bool ProcessCmdKey(ref System.Windows.Forms.Message msg, System.Windows.Forms.Keys keyData)

{
}
    Es necesario definir una constante, la cual usaremos a continuación en el método que mencionamos anteriormente. Esta constante se utiliza para capturar el evento de "KeyDown".

private const int WM_KEYDOWN = 0x100;

    Ahora vamos a escribir el código necesario para implementar esta característica en el User Control.

protected override bool ProcessCmdKey(ref System.Windows.Forms.Message msg, System.Windows.Forms.Keys keyData)
{
    switch (msg.Msg)
    {
        case WM_KEYDOWN:
        switch (keyData)
        {
            case System.Windows.Forms.Keys.Enter:
                try
                {
                    DataGridCell newCell = new DataGridCell(this.CurrentCell.RowNumber+1,this.CurrentCell.ColumnNumber);
                    this.CurrentCell = newCell;
                   
                }
                catch
                {
                }
                break;

            default:
                MessageBox.Show(keyData.ToString());
                break;
        }
        break;
    }
    return base.ProcessCmdKey(ref msg, keyData);
}

    Como podrán apreciar en el primer Switch se maneja el tipo de mensaje que se esta capturando, en nuestro caso solo capturaremos los mensajes que sean de WM_KEYDOWN. Seguidamente encontramos un nuevo Switch, este maneja la tecla que fue presionada, por lo tanto este es el switch que nos interesa.

    Les coloque dos ejemplos, el primero "case System.Windows.Forms.Keys.Enter" captura cuando es presionada la tecla [Enter] y en este caso avanza un fila. El segundo ejemplo simplemente muestra un MessageBox, el cual contiene la tecla que fue precionada.

    Y listo! Pueden agregar el User Control que acaban de crear y probarlo en un Formulario.

    Anexo les envío el código completo para el User Control.


ir al índice

Fichero con el código de ejemplo: dsabo_DataGridPersonalizado.zip - Tamaño 1 KB