2009-11-04 2 views
5

Qual è il modo più semplice per chiedere a DataGridView di restituire "indici di righe che hanno celle selezionate"? Questo non è lo stesso di DataGridView.SelectedRows. Non è consentita la selezione di righe o colonne. Quindi gli utenti devono selezionare blocchi di celle. Devo solo scoprire quali righe hanno selezionato le celle al loro interno.C# - DataGridView e SelectedCells - Ricerca dell'indice di riga delle celle selezionate

C'è qualche espressione lambda intelligente che dovrei usare? Cosa vorresti fare?

Se questo aiuta: Nel codice che sto scrivendo ho già ereditato da DataGridView e sono nella mia stessa classe personalizzata DataGridViewExt.

+0

mi sento come ci dovrebbe essere una sorta di SELEZIONE DISTINCT nella sintassi LINQ che dovrei fare. – BuddyJoe

+0

dovrebbe fare o potrebbe fare? –

+0

Dovrebbe essere - nel senso che qualcun altro supporterà questa base di codice tra un anno ... E se riesco a descrivere l'intento in 1 linea anziché da 3 a 5, sarebbe meglio per questo progetto. – BuddyJoe

risposta

9

soluzione LINQ:

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

Edit:

eri manca solo il Cast. È necessario perché DataGridViewSelectedCellCollection non implementa uno IEnumerable<DataGridViewCell> generico, solo IEnumerable, quindi quando si enumerano i valori, sono di tipo Object. Con il cast, che darebbe:

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

fantastico! +1 e rispondi. solo curioso ma quale sarebbe la sintassi alternativa? Sono stato incastrato da qualche parte: int [] rowIndexes = (da sc in this.SelectedCells seleziona sc.RowIndex) .Distinct(). ToArray(); puoi aggiungerlo alla risposta? – BuddyJoe

+0

Ho modificato la mia risposta. –

+0

Ah ok. È necessario leggere un articolo o due su LINQ e .Cast <>(). Grazie. – BuddyJoe

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