seleccionar marcar manejo event datagridviewcheckboxcolumn con c# winforms datagridview datagridviewcheckboxcell

c# - marcar - Marque/Desmarque una casilla de verificación en datagridview



seleccionar checkbox en datagridview c# (12)

¿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 casilla de verificación 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 casilla de verificación 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);


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


Debajo del código está funcionando perfecto

Seleccione / Deseleccione una columna de casilla de verificación en la cuadrícula de datos usando la casilla de verificación 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; } } } }


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 casilla de verificación 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 casilla de verificación 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..


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


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 casilla de verificación 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 casilla de verificación 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; } } } }


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


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.


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.


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


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