2009-11-04 31 views
5

¿Cuál es la forma más limpia de pedirle a un DataGridView que devuelva "índices de filas que tienen celdas seleccionadas"? Esto no es lo mismo que DataGridView.SelectedRows. No permito la selección de Fila o Columna. Entonces los usuarios deben seleccionar bloques de celdas. Solo necesito averiguar qué filas tienen celdas seleccionadas en ellas.C# - DataGridView y SelectedCells - Búsqueda de los índices de fila de celdas seleccionadas

¿Hay alguna expresión lambda inteligente que debería usar? ¿Qué harías?

Si esto ayuda: En el código que estoy escribiendo ya he heredado de DataGridView y yo estoy en mi propio DataGridViewExt clase personalizada.

+0

siento que debe haber algún tipo de SELECT DISTINCT en la sintaxis de LINQ que debería estar haciendo. – BuddyJoe

+0

¿Debería estar haciendo o podría estar haciendo? –

+0

Debería serlo, en el sentido de que otra persona admitirá esta base de código dentro de un año ... Y si puedo describir la intención en 1 línea en lugar de 3 a 5, sería mejor para este proyecto. – BuddyJoe

Respuesta

9

solución LINQ:

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

Editar:

Usted fueron sólo falta el moldeada. Es necesario porque DataGridViewSelectedCellCollection no implementa un IEnumerable<DataGridViewCell> genérico, solo IEnumerable, por lo que cuando enumera los valores, son del tipo Object. Con el reparto, que daría:

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

¡increíble! +1 y respuesta. solo curiosidad, pero ¿cuál sería la sintaxis alternativa? Me tropecé en alguna parte: int [] rowIndexes = (from sc in this. SelectedCells select sc.RowIndex) .Distinct(). ToArray(); ¿Puedes agregar eso a la respuesta? – BuddyJoe

+0

Edité mi respuesta. –

+0

Ah bien. Necesito leer un artículo o dos en LINQ y .Cast <>(). Gracias. – BuddyJoe

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