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