2009-08-06 9 views
17

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 affiche tous les éléments qui peuvent l'être, et vous sélectionnez ceux que vous souhaitez traiter cette fois-ci.Colonne de la case à cocher DataGridView - valeur et fonctionnalité

Quoi qu'il en soit, le code va maintenant ajouter un chckbox au début de la DGV. Ce que j'ai besoin de savoir est le suivant:

1) Comment faire pour que toute la colonne soit "cochée" par défaut? 2) Comment puis-je m'assurer que je ne reçois des valeurs des lignes "vérifiées" que lorsque je clique sur un bouton juste en dessous de la DGV?

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

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

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

Répondre

36
  1. Il n'existe 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 ceci:

    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 
    } 
    
+1

Merci beaucoup! C'est vraiment utile, mais juste une chose ... quand j'arrive à ce point, pour obtenir l'information des lignes vérifiées, comment pourrais-je obtenir l'information d'une cellule spécifique (par exemple la valeur de cellule dans la colonne 2 de toutes les cellules vérifiées) Aussi ... vous semblez vraiment connaître vos trucs pour C#, des livres que vous pouvez recommander? Merci. –

+0

En fait, peu importe, j'ai trouvé un moyen de le faire. Merci encore pour votre aide! –

+1

Content que tu l'aies découvert. Comme pour un livre à recommander, je ne peux pas dire que j'en connais aucune pour apprendre C#. J'utilise beaucoup le site msdn (http://msdn.microsoft.com/en-us/library/ms229335.aspx) pour chercher des méthodes/propriétés/descriptions/exemples/etc, donc je dirais que c'est probablement le meilleur référence, oh un SO aussi;) – SwDevMan81

13
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 vérifier si la case à cocher de la vue datagrid est cochée ou non.

+0

Merci, ça marche super! Pour gérer l'événement uniquement lorsque la cellule a une case à cocher: '// .... DataGridView dgv = (DataGridView) expéditeur; si (dgv.CurrentCell.GetType()! = Typeof (DataGridViewCheckBoxCell)) { return; } // ... ' – illagrenan

+0

Merci pour la bonne réponse! –

+1

merci @Nazeer juste un petit tweak à votre extrait de code 'if (ch1.Value == null) ch1.Value = false; ! ch1.Value = (bool) ch1.Value; ' à la place ' interrupteur (ch1.Value.ToString()) { cas "True": ch1.Value = false; Pause; case "False": ch1.Value = true; Pause; } ' une version compacte ' if (ch1.Value == null) ch1.Value = false; ch1.Value =! (Bool) ch1.Value; ' –

3

Il m'a fallu beaucoup de temps pour comprendre comment procéder sans avoir à boucler tous les enregistrements. J'ai un datagridview-source lié, et tous les champs sont liés excepté la colonne de 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'efforts, j'ai finalement compris. Et c'est en fait très simple aussi:

D'abord, vous ajoutez un nouveau fichier .cs à votre projet avec une cellule de case à cocher personnalisée, par ex.

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 case-colonne, vous faites:

// 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 voilà! Chaque fois que vos cases à cocher sont ajoutées dans une nouvelle ligne, elles seront définies sur true. Profitez-en!

+0

J'aime beaucoup cette implémentation. On dirait que la performance la plus rapide sage. Vous n'avez pas à faire de boucle. –

+0

Ceci est la réponse à la question. Je vous remercie. – EllieK

4

Voici une réponse d'une doublure pour cette question

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

+1 juste ce que je cherchais Rob, Merci. Note: Je recevais une exception DBNUll Objet non défini, donc j'ai changé votre code pour ceci: '// trouver les lignes sélectionnées - dans une ligne de bonté Lamba - sans exécution différée! Liste selectedSeriesCodes = grilleSeriesList.Rows.Cast (). Où (g =>! String.IsNullOrEmpty (g.Cells ["Selected"]. Value.ToString()) && Convert.ToBoolean (g.Cells ["Selected"]. Value) == true) .ToList(); ' –

+0

je vois mais dans le mien ça marche, votre mec de bienvenue. – Rob

1

Si vous avez un gridview contenant plus d'une case à cocher .... vous devriez essayer ....

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

Si vous essayez sur CellContentClick événement

Utilisation:

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

Pour tester 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 
    } 
} 
1

1) Comment puis-je faire de sorte que toute la colonne est "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 reçois uniquement des 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

si u faire cette colonne dans la base de données SQL (bits) en tant que type de données u devrait modifier ce code

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

avec cette

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