Columna de casilla de verificación DataGridView - valor y funcionalidad

votos
17

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!

Publicado el 06/08/2009 a las 10:17
fuente por usuario
En otros idiomas...                            


11 respuestas

votos
37

  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
    }
    
Respondida el 06/08/2009 a las 13:17
fuente por usuario

votos
14
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());
}

mejor solución para encontrar si la casilla de verificación en el DataGridView está marcada o no.

Respondida el 29/08/2010 a las 18:39
fuente por usuario

votos
3

me tomó mucho tiempo para encontrar la manera de hacer esto sin tener que recorrer todos los registros. Tengo un DataGridView de código atado, y todos los campos, están obligadas a excepción de la casilla de verificación-columna. Así que no tengo / necesito un bucle para agregar cada fila y que no quería crear uno sólo para esta purpuse. Así que después de un montón de tratar al fin entendí. Y en realidad es muy simple también:

En primer lugar se agrega un nuevo archivo .cs a su proyecto con una celda de casilla de verificación 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 se agrega la casilla de verificación-columna, que 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 añaden en una nueva fila, van a tener el valor true. ¡Disfrutar!

Respondida el 23/05/2011 a las 00:35
fuente por usuario

votos
4

He aquí una respuesta 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();
Respondida el 24/01/2012 a las 07:37
fuente por usuario

votos
1

Si usted tiene un gridview que contiene más de una casilla de verificación .... usted debe tratar este ....

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());
        }
    }
}
Respondida el 16/02/2012 a las 07:29
fuente por usuario

votos
3

Si lo intenta en CellContentClickEvento

Utilizar:

dataGridView1.EndEdit();  //Stop editing of cell.
MessageBox.Show("0 = " + dataGridView1.Rows[e.RowIndex].Cells[0].Value.ToString());
Respondida el 03/10/2012 a las 15:24
fuente por usuario

votos
0

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
    }
}
Respondida el 12/01/2013 a las 07:25
fuente por usuario

votos
1

1) ¿Cómo hago para que toda la columna está "controlada" 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 estar seguro de que sólo estoy poniendo los valores de las filas "controladas"?

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
    }
}
Respondida el 30/10/2014 a las 05:31
fuente por usuario

votos
0

si u hacer esta columna en la base de datos SQL (bits) como un tipo de datos u debe editar el 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);
Respondida el 01/06/2016 a las 20:10
fuente por usuario

votos
0

Es bastante sencillo

DataGridViewCheckBoxCell checkedCell = (DataGridViewCheckBoxCell) grdData.Rows[e.RowIndex].Cells["grdChkEnable"];

                bool isEnabled = false;
                if (checkedCell.AccessibilityObject.State.HasFlag(AccessibleStates.Checked))
                {
                    isEnabled = true;
                }
if(isEnabled)
 {
   // do your business process;
 }
Respondida el 30/06/2019 a las 09:40
fuente por usuario

votos
0

Si su columna ha sido ya creado debido a la unión con un conjunto de registros de tipo BIT, el tipo de la columna de texto será de todos modos. La solución que he encontrado es para eliminar esa columna y reemplazarlo con un "DataGridViewCheckBoxColumn" que tiene los mismos datos de unión.

            DataGridViewColumn oldCol = dgViewCategory.Columns["mycolumn"];
            int chkIdx = oldCol.Index;
            DataGridViewCheckBoxColumn chkCol = new DataGridViewCheckBoxColumn();
            chkCol.HeaderText = oldCol.HeaderText;
            chkCol.FalseValue = "False";
            chkCol.TrueValue = "True";
            chkCol.DataPropertyName = oldCol.DataPropertyName;
            chkCol.Name = oldCol.Name;
            dgViewCategory.Columns.RemoveAt(chkIdx);
            dgViewCategory.Columns.Insert(chkIdx, chkCol);
Respondida el 15/07/2019 a las 17:25
fuente por usuario

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more