c# winforms checkbox datagridview

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 } }