2010-07-20 6 views
3

Je suis flambant neuf à LINQ et j'essaie de l'utiliser dans mon projet de passe-temps actuel. J'ai un datagridview où la première cellule de chaque rangée est datagridviewcheckbox, et la 4ème cellule est une chaîne.LINQ Sélectionnez une certaine cellule dans DataGridView en fonction d'une autre cellule de la ligne

Si la case est cochée, j'ai besoin d'ajouter la valeur de la 4ème cellule à une liste.

Au début, j'essayé:

var selectedID = from c in multiContactLookup.SelectedCells.Cast<DataGridViewCell>() 
           select multiContactLookup.Rows[c.RowIndex].Cells[4].Value; 

Cela ne fonctionne pas parce que les cellules sont vérifiés programatically désélectionné donc c est jamais une valeur.

Alors j'ai essayé:

var sel2 = from r in multiContactLookup.Rows.Cast<DataGridViewRow>() 
         where r.Cells[0].Value is true select r.Cells[4].Value; 

mais en quelque sorte ma syntaxe est erronée. En utilisant LINQ, comment puis-je sélectionner les lignes où la première cellule est vérifiée, puis sélectionner la valeur de la première cellule? Dois-je séparer cela en deux collections?

Merci!

Répondre

8

Je pense que cela devrait fonctionner:

IEnumerable<string> values = multiContactLookup.Rows.Cast<DataGridViewRow>() 
    .Where(row => (bool)row.Cells[0].Value) 
    .Select(row => (string)row.Cells[3].Value); 
2

Peut-être pas la réponse que vous cherchez, mais ...

DataGridView (comme la plupart des contrôles gagnant-formes) n'est pas la meilleure source pour Commencez avec LINQ. La plupart des collections n'implémentent pas l'interface IEnumerable<T> correcte. C'est la raison pour laquelle vous avez besoin de la solution de contournement Cast().

En général, essayez d'éloigner le comportement des applications des contrôles et des données. Peut-être que votre grille est connectée à un DataTable. Dans ce cas, enregistrez les événements DataTable pour les données modifiées et travaillez avec les valeurs du DataRow, au lieu du DataGridViewRow et de ses cellules.

Questions connexes