2009-11-04 18 views
5

Jaki jest najczystszy sposób żądania DataGridView zwrócenia "indeksów wierszy z zaznaczonymi komórkami"? To nie jest to samo co DataGridView.SelectedRows. Nie zezwalam na wybór wiersza lub kolumny. Dlatego użytkownicy muszą wybierać bloki komórek. Po prostu muszę dowiedzieć się, które wiersze wybrały w nich komórki.C# - DataGridView i SelectedCells - Wyszukiwanie indeksów wierszy wybranych komórek

Czy powinienem użyć jakiegoś sprytnego wyrażenia lambda? Co byś zrobił?

Jeśli to pomaga: W kodzie piszę już dziedziczone z DataGridView i jestem w moim zwyczaju klasy DataGridViewExt.

+0

czuję się jak nie powinno być jakiś SELECT DISTINCT w składni LINQ, że należy robić. – BuddyJoe

+0

Powinien robić lub mógł robić? –

+0

Powinien być - w tym sensie, że ktoś inny będzie obsługiwał tę bazę kodów za rok ... I jeśli potrafię opisać intencje w 1 linii zamiast 3 do 5, które byłyby lepsze dla tego projektu. – BuddyJoe

Odpowiedz

9

rozwiązanie LINQ:

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

Edit:

Zostałaś właśnie brakuje oddanych. Jest to potrzebne, ponieważ DataGridViewSelectedCellCollection nie implementuje generycznego IEnumerable<DataGridViewCell>, tylko IEnumerable, więc po wyliczeniu wartości są one typu Object. Z obsadą, który dałby:

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

niesamowite! +1 i odpowiedź. tylko ciekawa, ale jaka byłaby alternatywna składnia? Natknąłem się gdzieś: int [] rowIndexes = (od sc w tym.SelectedCells select sc.RowIndex) .Distinct(). ToArray(); czy możesz dodać to do odpowiedzi? – BuddyJoe

+0

Edytowałem swoją odpowiedź. –

+0

Ah ok. Musisz przeczytać artykuł lub dwa na LINQ i .Cast <>(). Dzięki. – BuddyJoe

1
IEnumerable<int> indexes = 
(from c in dataGridView1.SelectedCells.Cast<DataGridViewCell>() 
    select c.RowIndex).Distinct(); 
Powiązane problemy