[WinForms - How To] Agregar controles en una grilla (Opción 2)
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.