[WinForms - How To] Agregar controles en una grilla (Opción 2)

agosto 11, 2016 Christian Amado 0 Comentarios

.NET En el artículo anterior, hemos visto como agregar controles a una celda dependiendo de las necesidades que tenemos para lograr el objetivo.

En este artículo mostraré una alternativa al artículo anterior, donde utilizaremos el reemplazo del control en la celda actual, donde ingresamos al hacer clic en la celda. Particularmente, esta forma me resulta más rápida y sencilla para mostrar un determinado control dentro de una celda.

Básicamente, empezamos declarando un objeto de la clase DateTimePicker:
//Esto lo colocas dentro de la clase, fuera de todos los métodos
DateTimePicker  dateTimePicker1;
La grilla posee un evento que se denomina CellClick que se dispara cuando hacemos clic dentro de una celda, por lo tanto aprovecharemos este evento para reemplazar la celda actual por la celda con el control que necesitamos en dicha columna.

Lo único que debemos tener disponible es el índice de la columna para poder reemplazar el control:
private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e)
{
    // Aquí se debe controlar el índice de columna del campo que se tiene como fecha
    // En este caso sería 1 (Fecha de algo)
    if (e.ColumnIndex == 1)
    {
        //Creamos el control por código
        dateTimePicker1 = new DateTimePicker();

        //Agregamos el control de fecha dentro del DataGridView 
        dataGridView1.Controls.Add(dateTimePicker1);

        // Hacemos que el control sea invisible (para que no moleste visualmente)
        dateTimePicker1.Visible = false;

        // Establecemos el formato (depende de la localización en tu PC)
        dateTimePicker1.Format = DateTimePickerFormat.Short;  //Ej: 24/08/2016

        // Agregamos el evento para cuando seleccionemos una fecha
        dateTimePicker1.TextChanged += new EventHandler(dateTimePicker1_OnTextChange);  

        // Lo hacemos visible
        dateTimePicker1.Visible = true;

        // Creamos un rectángulo que representa el área visible de la celda
        Rectangle rectangle1 = dataGridView1.GetCellDisplayRectangle(e.ColumnIndex, e.RowIndex, true);

        //Establecemos el tamaño del control DateTimePicker (que sería el tamaño total de la celda)
        dateTimePicker1.Size = new Size(rectangle1.Width, rectangle1.Height);

        // Establecemos la ubicación del control
        dateTimePicker1.Location = new Point(rectangle1.X, rectangle1.Y);
  
        // Generamos el evento de cierre del control fecha
        dateTimePicker1.CloseUp += new EventHandler(dateTimePicker1_CloseUp);
    }
}
Ahora procedemos a manejar los eventos que dispara el control datetimepicker:
private void dateTimePicker1_OnTextChange(object sender, EventArgs e)
{
    //Asignamos a la celda el valor de la fecha seleccionada
    dataGridView1.CurrentCell.Value = dateTimePicker1.Text.ToString();
}

void dateTimePicker1_CloseUp(object sender, EventArgs e)
{
    //Volvemos a colocar en invisible el control
    dateTimePicker1.Visible = false;
}
De esta manera se logra reemplazar el control en la celda seleccionada sin la necesidad de recorrer todas las filas para realizar el reemplazo. Con este método logramos reemplazar únicamente la celda necesaria. Dependiendo del nivel de procesamiento del equipo el control se mostrará rápidamente o lentamente.