web-dev-qa-db-fra.com

Colonne de case à cocher DataGridView - valeur et fonctionnalité

J'ai ajouté une colonne de case à cocher à un DataGridView dans mon formulaire C #. La fonction doit être dynamique: vous sélectionnez un client et y affiche tous les éléments susceptibles d’être gérés, et vous choisissez celui d’entre eux que vous souhaitez utiliser, cette fois-ci.

Quoi qu'il en soit, le code va maintenant ajouter une boîte à outils au début du fichier DGV. Ce que j'ai besoin de savoir est le suivant:

1) Comment puis-je faire en sorte que toute la colonne soit "cochée" par défaut? DGV?

Voici le code pour obtenir la colonne insérée:

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

Alors, que faire ensuite? Toute aide serait grandement appréciée!

16
David Archer
  1. Il n'y a aucun moyen de le faire directement. Une fois que vous avez vos données dans la grille, vous pouvez parcourir les lignes et cocher chaque case comme suit:

    foreach (DataGridViewRow row in dataGridView1.Rows)
    {
        row.Cells[CheckBoxColumn1.Name].Value = true;
    }
    
  2. L'événement Click pourrait ressembler à ceci:

    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
    }
    
37
SwDevMan81
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());
}

meilleure solution pour savoir si la case à cocher dans la datagridview est cochée ou non.

14
Nazeer

Voici une réponse à une question pour cette question

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

il m'a fallu beaucoup de temps pour comprendre comment faire cela sans avoir à parcourir tous les enregistrements. J'ai un datagridview-source lié, et tous les champs sont liés à l'exception de la colonne case à cocher. Donc, je n'ai pas/besoin d'une boucle pour ajouter chaque ligne et je ne voulais pas en créer une juste pour ce but. Donc, après beaucoup d'essais, je l'ai finalement obtenu. Et c'est en fait très simple aussi:

Tout d'abord, vous ajoutez un nouveau fichier .cs à votre projet avec une cellule à case à cocher personnalisée, par exemple. 

DataGridViewCheckboxCellFilter.cs:

using System.Windows.Forms;

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

Après cela, sur votre GridView, où vous ajoutez la colonne à cocher, vous effectuez les opérations suivantes:

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

Et c'est tout! Chaque fois que vos cases à cocher seront ajoutées dans une nouvelle ligne, elles seront définies sur true . Enjoy!

3
andzep

Si vous l'essayez sur CellContentClick Event

Utilisation:

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

Si vous avez une grille contenant plus d’une case à cocher .....__, vous devriez essayer ceci ....

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());
        }
    }
}
1
Amin Mansuri

si vous faites cette colonne dans la base de données SQL (bit) comme un type de données, vous devriez éditer ce code

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

avec ça

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

Pour vérifier si la colonne est cochée ou non:

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

1) Comment faire pour que la colonne entière soit "cochée" par défaut?

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) Comment puis-je m'assurer que je n'obtiens que les valeurs des lignes "vérifiées"?

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
    }
}
0
DarkChowder