valores valor una texto seleccionar recorrer obtener net filas columnas columna celda buscar asignar c# winforms datagridview checkbox

c# - una - Columna de casilla de verificación DataGridView-valor y funcionalidad



recorrer filas y columnas datagridview c# (9)

Agregué una columna de casilla de verificación a DataGridView en mi formulario C #. La función debe ser dinámica: selecciona un cliente y muestra todos los elementos a los que podría dar servicio, y esta vez, seleccione cuál de ellos desea que se le dé servicio.

De todos modos, el código ahora agregará un chckbox al comienzo de la DGV. Lo que necesito saber es lo siguiente:

1) ¿Cómo lo hago para que toda la columna esté "marcada" por defecto? 2) ¿Cómo puedo asegurarme de que solo obtengo valores de las filas "marcadas" cuando hago clic en un botón justo debajo del DGV?

Aquí está el código para insertar la columna:

DataGridViewCheckBoxColumn doWork = new DataGridViewCheckBoxColumn(); doWork.HeaderText = "Include Dog"; doWork.FalseValue = "0"; doWork.TrueValue = "1"; dataGridView1.Columns.Insert(0, doWork);

Entonces, ¿qué sigue? ¡Cualquier ayuda sería muy apreciada!


Me llevó mucho tiempo descubrir cómo hacerlo sin tener que recorrer todos los registros. Tengo una datagridview-source enlazada, y todos los campos están vinculados, excepto la casilla de verificación-columna. Así que no tengo / necesito un ciclo para agregar cada fila y no quería crear uno solo para este propósito. Entonces, después de intentarlo, finalmente lo conseguí. Y en realidad es muy simple también:

Primero, agrega un nuevo archivo .cs a su proyecto con una celda personalizada, por ejemplo

DataGridViewCheckboxCellFilter.cs:

using System.Windows.Forms; namespace MyNamespace { public class DataGridViewCheckboxCellFilter : DataGridViewCheckBoxCell { public DataGridViewCheckboxCellFilter() : base() { this.FalseValue = 0; this.TrueValue = 1; this.Value = TrueValue; } } }

Después de esto, en su GridView, donde agrega la casilla de verificación-columna, usted hace:

// add checkboxes DataGridViewCheckBoxColumn col_chkbox = new DataGridViewCheckBoxColumn(); { col_chkbox.HeaderText = "X"; col_chkbox.Name = "checked"; col_chkbox.CellTemplate = new DataGridViewCheckboxCellFilter(); } this.Columns.Add(col_chkbox);

¡Y eso es! Cada vez que sus casillas de verificación se agreguen en una nueva fila, se establecerán en verdadero. ¡Disfrutar!


private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e) { DataGridViewCheckBoxCell ch1 = new DataGridViewCheckBoxCell(); ch1 = (DataGridViewCheckBoxCell)dataGridView1.Rows[dataGridView1.CurrentRow.Index].Cells[0]; if (ch1.Value == null) ch1.Value=false; switch (ch1.Value.ToString()) { case "True": ch1.Value = false; break; case "False": ch1.Value = true; break; } MessageBox.Show(ch1.Value.ToString()); }

La mejor solución para encontrar si la casilla de verificación en la vista de tabla de datos está marcada o no.


Aquí hay una respuesta de un trazador de líneas para esta pregunta

List<DataGridViewRow> list = DataGridView1.Rows.Cast<DataGridViewRow>().Where(k => Convert.ToBoolean(k.Cells[CheckBoxColumn1.Name].Value) == true).ToList();


Si tiene una vista de cuadrícula que contiene más de una casilla de verificación ... debe intentar esto ...

Object[] o=new Object[6]; for (int i = 0; i < dgverlist.RowCount; i++) { for (int j = 2; j < dgverlist.ColumnCount; j++) { DataGridViewCheckBoxCell ch1 = new DataGridViewCheckBoxCell(); ch1 = (DataGridViewCheckBoxCell)dgverlist.Rows[i].Cells[j]; if (ch1.Value != null) { o[i] = ch1.OwningColumn.HeaderText.ToString(); MessageBox.Show(o[i].ToString()); } } }


Si lo intentas en CellContentClick Event

Utilizar:

dataGridView1.EndEdit(); //Stop editing of cell. MessageBox.Show("0 = " + dataGridView1.Rows[e.RowIndex].Cells[0].Value.ToString());


Para probar si la columna está marcada o no:

for (int i = 0; i < dgvName.Rows.Count; i++) { if ((bool)dgvName.Rows[i].Cells[8].Value) { // Column is checked } }


1) ¿Cómo lo hago para que toda la columna esté "marcada" por defecto?

var doWork = new DataGridViewCheckBoxColumn(); doWork.Name = "IncludeDog" //Added so you can find the column in a row doWork.HeaderText = "Include Dog"; doWork.FalseValue = "0"; doWork.TrueValue = "1"; //Make the default checked doWork.CellTemplate.Value = true; doWork.CellTemplate.Style.NullValue = true; dataGridView1.Columns.Insert(0, doWork);

2) ¿Cómo puedo asegurarme de que solo obtengo valores de las filas "marcadas"?

foreach (DataGridViewRow row in dataGridView1.Rows) { if (row.IsNewRow) continue;//If editing is enabled, skip the new row //The Cell''s Value gets it wrong with the true default, it will return //false until the cell changes so use FormattedValue instead. if (Convert.ToBoolean(row.Cells["IncludeDog"].FormattedValue)) { //Do stuff with row } }


  1. No hay forma de hacer eso directamente. Una vez que tenga sus datos en la cuadrícula, puede recorrer las filas y marcar cada casilla como esta:

    foreach (DataGridViewRow row in dataGridView1.Rows) { row.Cells[CheckBoxColumn1.Name].Value = true; }

  2. El evento Click podría verse más o menos así:

    private void button1_Click(object sender, EventArgs e) { List<DataGridViewRow> rows_with_checked_column = new List<DataGridViewRow>(); foreach (DataGridViewRow row in dataGridView1.Rows) { if (Convert.ToBoolean(row.Cells[CheckBoxColumn1.Name].Value) == true) { rows_with_checked_column.Add(row); } } // Do what you want with the check rows }


Si haces esta columna en la base de datos sql (bit) como un tipo de datos, deberías editar este código

DataGridViewCheckBoxColumn doWork = new DataGridViewCheckBoxColumn(); doWork.HeaderText = "Include Dog"; doWork.FalseValue = "0"; doWork.TrueValue = "1"; dataGridView1.Columns.Insert(0, doWork);

con este

DataGridViewCheckBoxColumn doWork = new DataGridViewCheckBoxColumn(); doWork.HeaderText = "Include Dog"; doWork.FalseValue = "False"; doWork.TrueValue = "True"; dataGridView1.Columns.Insert(0, doWork);