C#DataGridView Checkbox evento marcado
winforms (1)
Quiero manejar el evento
Checked
de las columnas
CheckBox
en mi
DataGridView
y realizar una operación basada en el valor verificado de la columna (verdadero / falso).
Traté de usar
CellDirtyStateChanged
sin ningún éxito.
De hecho, quiero detectar el cambio marcado inmediatamente después de que el usuario marque o desmarque la casilla de verificación.
Aquí hay una descripción sobre mi aplicación. Soy nuevo en c # y estoy haciendo una aplicación "reservar mi habitación" para un lugar que ofrece alojamiento para huéspedes a los viajeros. Esta pantalla puede explicar bien lo que deseo lograr;
Este es un .GIF de un software que calcula el pago por hora de un empleado y esta foto es una ilustración de lo que realmente quiero construir:
El código para mostrar mi tabla en
DataGridView
es:
OleDbConnection connection = new OleDbConnection();
connection.Open();
OleDbCommand command = new OleDbCommand();
command.Connection = connection;
string query = "select id,cusid,cusname,timein,
timeout,duration,amount,remark from entry";
command.CommandText = query;
OleDbDataAdapter da = new OleDbDataAdapter(command);
DataTable dt = new DataTable();
da.Fill(dt);
dataGridView1.DataSource = dt;
Agregué la columna de casilla de verificación usando esto;
DataGridViewCheckBoxColumn checkColumn = new DataGridViewCheckBoxColumn();
checkColumn.Name = "logout";
checkColumn.HeaderText = "Logout";
checkColumn.Width = 50;
checkColumn.ReadOnly = false;
checkColumn.FillWeight = 10;
dataGridView1.Columns.Add(checkColumn);
Cada vez que un usuario inicie sesión desde la pantalla de inicio de sesión, se insertará una nueva fila en la tabla y, por lo tanto, se actualizará el dgv, con la entrada correspondiente de los usuarios. No entiendo cómo vincular esas casillas de verificación con la vista de cuadrícula de datos. Intenté cambiar el estado de celldirty pero nada funciona, cuál sería la forma correcta de asociar la fila con la casilla de verificación.
Puede manejar el evento
CellContentClick
de su
DataGridView
y poner la lógica para cambiar esas celdas allí.
El punto clave es usar
CommitEdit(DataGridViewDataErrorContexts.Commit)
para confirmar los cambios en la celda actual en el caché de datos sin finalizar el modo de edición.
De esta manera, cuando verifica el valor de la celda en este evento, devuelve el valor actual marcado o no marcado que ve en la celda actualmente después de hacer clic:
private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e)
{
//We make DataGridCheckBoxColumn commit changes with single click
//use index of logout column
if(e.ColumnIndex == 4 && e.RowIndex>=0)
this.dataGridView1.CommitEdit(DataGridViewDataErrorContexts.Commit);
//Check the value of cell
if((bool)this.dataGridView1.CurrentCell.Value == true)
{
//Use index of TimeOut column
this.dataGridView1.Rows[e.RowIndex].Cells[3].Value = DateTime.Now;
//Set other columns values
}
else
{
//Use index of TimeOut column
this.dataGridView1.Rows[e.RowIndex].Cells[3].Value = DBNull.Value;
//Set other columns values
}
}