2009-11-04 13 views
5

Was ist der sauberste Weg, um ein DataGridView zu bitten, "Indizes von Zeilen mit ausgewählten Zellen" zurückzugeben? Dies ist nicht dasselbe wie DataGridView.SelectedRows. Ich erlaube keine Zeilen- oder Spaltenauswahl. Also müssen Benutzer Blöcke von Zellen auswählen. Ich muss nur herausfinden, welche Zeilen Zellen in ihnen ausgewählt haben.C# - DataGridView und SelectedCells - Suchen der Zeilenindizes ausgewählter Zellen

Gibt es einen cleveren Lambda-Ausdruck, den ich verwenden sollte? Was würden Sie tun?

Wenn diese hilft: Im Code, den ich ich habe schon von Datagridview geerbt schreibe, und ich bin in meiner eigenen benutzerdefinierten Klasse DataGridViewExt.

+0

Ich fühle mich wie es sollte eine gewisse Art von SELECT DISTINCT in LINQ-Syntax, die ich tun sollte. – BuddyJoe

+0

Sollte tun oder könnte tun? –

+0

Sollte - in dem Sinne, dass jemand anderes diese Codebasis in einem Jahr unterstützen wird ... Und wenn ich die Absicht in 1 Zeile anstatt 3 bis 5 beschreiben könnte, wäre das für dieses Projekt besser. – BuddyJoe

Antwort

9

LINQ Lösung:

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

Edit:

Sie wurden nur die Cast fehlt. Es wird benötigt, da DataGridViewSelectedCellCollection kein generisches IEnumerable<DataGridViewCell>, nur IEnumerable implementiert. Wenn Sie also die Werte aufzählen, sind sie vom Typ Object. Mit der Besetzung würde, dass geben:

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

genial! +1 und antwort. nur neugierig, aber was wäre die alternative Syntax? Ich bin irgendwo gestolpert: int [] rowIndexes = (von sc in diesem. SelectedCells select sc.RowIndex) .Distinct(). ToArray(); Kannst du das zur Antwort hinzufügen? – BuddyJoe

+0

Ich habe meine Antwort bearbeitet. –

+0

Ah ok. Müssen Sie einen oder zwei Artikel zu LINQ und .Cast <>() lesen. Vielen Dank. – BuddyJoe

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