2009-11-04 4 views
5

Quelle est la manière la plus simple de demander à un DataGridView de renvoyer des "index de lignes ayant des cellules sélectionnées"? Ce n'est pas la même chose que DataGridView.SelectedRows. Je n'autorise pas la sélection de lignes ou de colonnes. Les utilisateurs doivent donc sélectionner des blocs de cellules. J'ai juste besoin de savoir quelles lignes ont sélectionné des cellules en eux.C# - DataGridView et SelectedCells - Recherche des index de ligne des cellules sélectionnées

Existe-t-il une expression lambda intelligente que je devrais utiliser? Que feriez-vous?

Si cela aide: Dans le code que je vous écris, je l'ai déjà hérité de DataGridView et je suis dans ma propre DataGridViewExt de classe personnalisée.

+0

je me sens comme il devrait y avoir une sorte de SELECT DISTINCT dans la syntaxe LINQ que je devrais faire. – BuddyJoe

+0

Devrait faire ou pourrait faire? –

+0

Devrait être - en ce sens que quelqu'un d'autre soutiendra cette base de code d'ici un an ... Et si je peux décrire l'intention dans 1 ligne plutôt que 3 à 5 ce serait mieux pour ce projet. – BuddyJoe

Répondre

9

solution LINQ:

var rowIndexes = dgv.SelectedCells.Cast<DataGridViewCell>() 
            .Select(cell => cell.RowIndex) 
            .Distinct(); 

Edit:

vous venez de manque Cast. C'est nécessaire parce que DataGridViewSelectedCellCollection n'implémente pas un IEnumerable<DataGridViewCell> générique, juste IEnumerable, donc quand vous énumérez les valeurs, elles sont de type Object. Avec le casting, cela donnerait:

int[] rowIndexes = (from sc in this.SelectedCells.Cast<DataGridViewCell>() 
        select sc.RowIndex).Distinct().ToArray(); 
+0

génial! +1 et répondez. juste curieux mais quelle serait la syntaxe alternative? Je me suis fait trébucher quelque part: int [] rowIndexes = (de sc dans this.SelectedCells sélectionnez sc.RowIndex) .Distinct(). ToArray(); pouvez-vous ajouter cela à la réponse? – BuddyJoe

+0

J'ai édité ma réponse. –

+0

Ah ok. Besoin de lire un article ou deux sur LINQ et .Cast <>(). Merci. – BuddyJoe

1
IEnumerable<int> indexes = 
(from c in dataGridView1.SelectedCells.Cast<DataGridViewCell>() 
    select c.RowIndex).Distinct(); 
Questions connexes