Marque / Desmarque una checkbox en datagridview

¿Alguien puede ayudarme por qué no funciona? Tengo una checkbox y si hago clic en ella, esto debe desmarcar todas las casillas dentro de la vista de tabla de datos que fueron marcadas antes de incluir la checkbox seleccionada por el usuario.

Aquí está el código:

  private void chkItems_CheckedChanged(object sender, EventArgs e) { foreach (DataGridViewRow row in datagridview1.Rows) { DataGridViewCheckBoxCell chk = (DataGridViewCheckBoxCell)row.Cells[1]; if (chk.Selected == true) { chk.Selected = false; } else { chk.Selected = true; } } } 

la checkbox no debe ser seleccionada. debe ser verificado.

aquí está la columna añadida

  DataGridViewCheckBoxColumn CheckboxColumn = new DataGridViewCheckBoxColumn(); CheckBox chk = new CheckBox(); CheckboxColumn.Width = 20; datagridview1.Columns.Add(CheckboxColumn); 

En cuanto a publicar este foro de MSDN , sugiere comparar el valor de la celda con Cell.TrueValue .

Así que, siguiendo su ejemplo, tu código debería ser algo así 🙁 esto no se ha probado por completo )

Editar: parece que el valor predeterminado para Cell.TrueValue para un DataGridViewCheckBox sin consolidar es nulo, tendrá que establecerlo en la definición de la columna.

 private void chkItems_CheckedChanged(object sender, EventArgs e) { foreach (DataGridViewRow row in dataGridView1.Rows) { DataGridViewCheckBoxCell chk = (DataGridViewCheckBoxCell)row.Cells[1]; if (chk.Value == chk.TrueValue) { chk.Value = chk.FalseValue; } else { chk.Value = chk.TrueValue; } } } 

Este código es una nota funcional que establece TrueValue y FalseValue en Constructor plus y también comprueba null:

 public partial class Form1 : Form { public Form1() { InitializeComponent(); DataGridViewCheckBoxColumn CheckboxColumn = new DataGridViewCheckBoxColumn(); CheckboxColumn.TrueValue = true; CheckboxColumn.FalseValue = false; CheckboxColumn.Width = 100; dataGridView1.Columns.Add(CheckboxColumn); dataGridView1.Rows.Add(4); } private void chkItems_CheckedChanged(object sender, EventArgs e) { foreach (DataGridViewRow row in dataGridView1.Rows) { DataGridViewCheckBoxCell chk = (DataGridViewCheckBoxCell)row.Cells[0]; if (chk.Value == chk.FalseValue || chk.Value == null) { chk.Value = chk.TrueValue; } else { chk.Value = chk.FalseValue; } } dataGridView1.EndEdit(); } } 

Estaba haciendo mi propia versión de una checkbox para controlar un DataGridViewCheckBoxColumn cuando vi que esta publicación en realidad no había sido respondida. Para establecer el estado verificado de un uso de DataGridViewCheckBoxCell:

 foreach (DataGridViewRow row in dataGridView1.Rows) { dataGridView1.Rows[row.Index].SetValues(true); } 

Para cualquiera que intente lograr lo mismo, esto es lo que se me ocurrió.

Esto hace que los dos controles se comporten como la columna de checkbox en Gmail. Mantiene la funcionalidad para el mouse y el teclado.

 using System; using System.Windows.Forms; namespace Check_UnCheck_All { public partial class Check_UnCheck_All : Form { public Check_UnCheck_All() { InitializeComponent(); dataGridView1.RowCount = 10; dataGridView1.AllowUserToAddRows = false; this.dataGridView1.CellContentClick += new System.Windows.Forms.DataGridViewCellEventHandler(this.dgvApps_CellContentClick); this.dataGridView1.CellMouseUp += new System.Windows.Forms.DataGridViewCellMouseEventHandler(this.myDataGrid_OnCellMouseUp); this.dataGridView1.CellValueChanged += new System.Windows.Forms.DataGridViewCellEventHandler(this.myDataGrid_OnCellValueChanged); this.checkBox1.Click += new System.EventHandler(this.checkBox1_Click); } public int chkInt = 0; public bool chked = false; public void myDataGrid_OnCellValueChanged(object sender, DataGridViewCellEventArgs e) { if (e.ColumnIndex == dataGridView1.Rows[0].Index && e.RowIndex != -1) { DataGridViewCheckBoxCell chk = dataGridView1.Rows[e.RowIndex].Cells[0] as DataGridViewCheckBoxCell; if (Convert.ToBoolean(chk.Value) == true) chkInt++; if (Convert.ToBoolean(chk.Value) == false) chkInt--; if (chkInt < dataGridView1.Rows.Count && chkInt > 0) { checkBox1.CheckState = CheckState.Indeterminate; chked = true; } else if (chkInt == 0) { checkBox1.CheckState = CheckState.Unchecked; chked = false; } else if (chkInt == dataGridView1.Rows.Count) { checkBox1.CheckState = CheckState.Checked; chked = true; } } } public void myDataGrid_OnCellMouseUp(object sender, DataGridViewCellMouseEventArgs e) { // End of edition on each click on column of checkbox if (e.ColumnIndex == dataGridView1.Rows[0].Index && e.RowIndex != -1) { dataGridView1.EndEdit(); } dataGridView1.BeginEdit(true); } public void dgvApps_CellContentClick(object sender, DataGridViewCellEventArgs e) { if (dataGridView1.CurrentCell.GetType() == typeof(DataGridViewCheckBoxCell)) { if (dataGridView1.CurrentCell.IsInEditMode) { if (dataGridView1.IsCurrentCellDirty) { dataGridView1.EndEdit(); } } dataGridView1.BeginEdit(true); } } public void checkBox1_Click(object sender, EventArgs e) { if (chked == true) { foreach (DataGridViewRow row in dataGridView1.Rows) { DataGridViewCheckBoxCell chk = (DataGridViewCheckBoxCell)row.Cells[0]; if (chk.Value == chk.TrueValue) { chk.Value = chk.FalseValue; } else { chk.Value = chk.TrueValue; } } chked = false; chkInt = 0; return; } if (chked == false) { foreach (DataGridViewRow row in dataGridView1.Rows) { dataGridView1.Rows[row.Index].SetValues(true); } chked = true; chkInt = dataGridView1.Rows.Count; } } } } 

El código que está intentando aquí invertirá los estados (si es verdadero y luego se convirtió en falso al revés) de las casillas de verificación, independientemente de la checkbox seleccionada por el usuario, porque aquí el foreach selecciona cada checkbox y realiza las operaciones.

Para dejarlo en claro, guarde el index de la casilla seleccionada por el usuario antes de realizar la operación foreach y después de la operación foreach , llame a la checkbox mencionando el índice almacenado y verifíquelo (en su caso, hágalo True , creo).

Esto es solo lógica y estoy absolutamente seguro de que es correcto. Trataré de implementar algún código de muestra si es posible.

Modifique su foreach algo como esto:

  //Store the index of the selected checkbox here as Integer (you can use e.RowIndex or e.ColumnIndex for it). private void chkItems_CheckedChanged(object sender, EventArgs e) { foreach (DataGridViewRow row in datagridview1.Rows) { DataGridViewCheckBoxCell chk = (DataGridViewCheckBoxCell)row.Cells[1]; if (chk.Selected == true) { chk.Selected = false; } else { chk.Selected = true; } } } //write the function for checking(making true) the user selected checkbox by calling the stored Index 

La función anterior hace que todas las casillas de verificación sean verdaderas, incluido el usuario seleccionado CheckBox. Creo que esto es lo que quieres..

Pruebe el siguiente código que debería funcionar

 private void checkBox2_CheckedChanged(object sender, EventArgs e) { if (checkBox2.Checked == false) { foreach (DataGridViewRow row in dGV1.Rows) { DataGridViewCheckBoxCell chk = (DataGridViewCheckBoxCell)row.Cells[0]; chk.Value = chk.TrueValue; } } else if (checkBox2.Checked == true) { foreach (DataGridViewRow row in dGV1.Rows) { DataGridViewCheckBoxCell chk = (DataGridViewCheckBoxCell)row.Cells[0]; chk.Value = 1; if (row.IsNewRow) { chk.Value = 0; } } } } 

Debajo del código está funcionando perfecto

Seleccione / Deseleccione una columna de checkbox en la cuadrícula de datos usando la checkbox CONTROL

  private void checkBox2_CheckedChanged(object sender, EventArgs e) { if (checkBox2.Checked == false) { foreach (DataGridViewRow row in dGV1.Rows) { DataGridViewCheckBoxCell chk = (DataGridViewCheckBoxCell)row.Cells[0]; chk.Value = chk.TrueValue; } } else if(checkBox2.Checked==true) { foreach (DataGridViewRow row in dGV1.Rows) { DataGridViewCheckBoxCell chk = (DataGridViewCheckBoxCell)row.Cells[0]; chk.Value = 1; if (row.IsNewRow) { chk.Value = 0; } } } } 

Un código simple para ti funcionará

 private void dgv_CellClick(object sender, DataGridViewCellEventArgs e) { if (dgv.CurrentRow.Cells["ColumnNumber"].Value != null && (bool)dgv.CurrentRow.Cells["ColumnNumber"].Value) { dgv.CurrentRow.Cells["ColumnNumber"].Value = false; dgv.CurrentRow.Cells["ColumnNumber"].Value = null; } else if (dgv.CurrentRow.Cells["ColumnNumber"].Value == null ) { dgv.CurrentRow.Cells["ColumnNumber"].Value = true; } } 

Si bien todas las otras respuestas son correctas, agregaré otra opción simple que funcionó para mí:

 var r = dataGridView.Rows[rIndex]; var c = r.Cells[cIndex]; var value = (bool) c.Value; c.Value = !value; 

Comprimido:

 var r = dataGridView.Rows[rIndex]; r.Cells[cIndex].Value = !((bool) r.Cells[cIndex].Value) 

Siempre que cIndex refiera a una celda que sea del tipo DataGridViewCheckBoxCell , funcionará bien. Espero que esto ayude a alguien.

puedes probar este código:

 DataGridViewCheckBoxCell chk = (DataGridViewCheckBoxCell)dataGridView1.CurrentRow.Cells[0]; dataGridView1.BeginEdit(true); if (chk.Value == null || (int)chk.Value == 0) { chk.Value = 1; } else { chk.Value = 0; } dataGridView1.EndEdit(); 
 // here is a simple way to do so //irate through the gridview foreach (DataGridViewRow row in PifGrid.Rows) { //store the cell (which is checkbox cell) in an object DataGridViewCheckBoxCell oCell = row.Cells["Check"] as DataGridViewCheckBoxCell; //check if the checkbox is checked or not bool bChecked = (null != oCell && null != oCell.Value && true == (bool)oCell.Value); //if its checked then uncheck it other wise check it if (!bChecked) { row.Cells["Check"].Value = true; } else { row.Cells["Check"].Value = false; } } 

Tuve el mismo problema, e incluso con las soluciones proporcionadas aquí, no funcionó. Las casillas de verificación simplemente no cambiarían, su valor permanecería nulo. Me llevó años darme cuenta de mi estupidez:

Resulta que llamé a form1.PopulateDataGridView(my data) en el Formulario derivado de la clase Form1 antes de llamar a form1.Show() . Cuando modifiqué el pedido, es decir, primero se llamó a Show() , y luego leí los datos y llené las casillas de verificación; el valor no se mantuvo nulo.

El siguiente código permite al usuario desactivar / marcar las casillas de verificación en DataGridView, si las celdas se crean en código

 private void gvData_CellClick(object sender, DataGridViewCellEventArgs e) { DataGridViewCheckBoxCell chk = (DataGridViewCheckBoxCell)gvData.Rows[e.RowIndex].Cells[0]; if (chk.Value == chk.TrueValue) { gvData.Rows[e.RowIndex].Cells[0].Value = chk.FalseValue; } else { gvData.Rows[e.RowIndex].Cells[0].Value = chk.TrueValue; } } 

Aquí hay otro ejemplo que puedes probar

 private void dataGridView_CellContentClick(object sender, DataGridViewCellEventArgs e) { if (e.ColumnIndex == dataGridView.Columns["Select"].Index) { dataGridView.EndEdit(); if ((bool)dataGridView.Rows[e.RowIndex].Cells["Select"].Value) { //-- checking current select, needs to uncheck any other cells that are checked foreach(DataGridViewRow row in dataGridView.Rows) { if (row.Index == e.RowIndex) { dataGridView.Rows[row.Index].SetValues(true); } else { dataGridView.Rows[row.Index].SetValues(false); } } } } }