2010-09-28 45 views
7

Tengo algunos problemas para configurar la última fila en mi vista de cuadro de datos seleccionado. Selecciono la última fila de esta manera:DatagridView Seleccionar la última fila

if (grid.Rows.Count > 0) 
{ 
    try 
    { 
     grid.Rows[grid.Rows.Count - 1].Selected = true; 
     grid.CurrentCell = grid.Rows[grid.Rows.Count - 1].Cells[1] 
    } 
    catch (IndexOutOfRangeException) 
    { } 
    catch (ArgumentOutOfRangeException) 
    { } 
} 

Cuando ejecuto el código me sale una excepción: IndexOutOfRangeException occurred: Índice-1 no tiene un valor.

Cuando depuro la colección Rows y la correspondiente colección Cells veo que se llenan ambas colecciones. El índice también existe de la colección Filas y Células.

No tengo ni idea de qué estoy haciendo mal aquí. ¿Alguien que pueda ayudarme aquí? Thnx

EDIT:

Aquí es la excepción completa:

System.IndexOutOfRangeException: Index -1 does not have a value. 
at System.Windows.Forms.CurrencyManager.get_Item(Int32 index) 
at System.Windows.Forms.CurrencyManager.get_Current() 
at System.Windows.Forms.DataGridView.DataGridViewDataConnection.OnRowEnter(DataGridViewCellEventArgs e) 
at System.Windows.Forms.DataGridView.OnRowEnter(DataGridViewCell& dataGridViewCell, Int32 columnIndex, Int32 rowIndex, Boolean canCreateNewRow, Boolean validationFailureOccurred) 
at System.Windows.Forms.DataGridView.SetCurrentCellAddressCore(Int32 columnIndex, Int32 rowIndex, Boolean setAnchorCellAddress, Boolean validateCurrentCell, Boolean throughMouseClick) 
at System.Windows.Forms.DataGridView.set_CurrentCell(DataGridViewCell value) 
+0

El código parece correcto. ¿Has probado a depurarlo? ¿En qué línea de código está obteniendo el error? –

+0

Pruebe un ** Quick Watch ** para 'grid.Rows [grid.Rows.Count - 1] .Cells [1]' y vea lo que devuelve. –

+0

@Aseem: la línea es: 'grid.CurrentCell = grid.Rows [grid.Rows.Count - 1] .Cells [1]' – Martijn

Respuesta

1

su bloque 'captura' para IndexOutOfRangeException está vacía, y no mostrará ningún error en absoluto.

O su pregunta no es exacta, o la excepción está siendo arrojada a otro lugar.

EDIT: han consultado a través de la pila de llamadas que ha agregado, puedo ver que el error es, de hecho, no ser arrojado aquí, sino más bien en los Current/Item propiedades de clase CurrencyManager, que es en última instancia, siendo desencadenado por la llamada al CurrentCell setter.

En pocas palabras: el problema no está en este código; la excepción está siendo lanzada por alguna otra pieza de código desencadenada por la configuración de la celda actual.

+0

Lanza un excetpion en modo de depuración. El código deja de funcionar y VS está resaltando. Pero ese no es el punto. El punto es, ¿POR QUÉ se lanza la excepción? – Martijn

+0

Usaría la ventana "Inmediato" para confirmar el valor de grid.Rows.Count, luego intentaré acceder a grid.Rows [0] o cualquier número que use un literal entero, solo para estar seguro. Sospecho que el código aquí no es una copia exacta del código que está causando la excepción, y en algún lugar entre eso y lo que * piensas * tu código está haciendo, yace el error. –

+0

En la ventana inmediata tengo filas y celdas en las colecciones – Martijn

2

¿Has pensado en usar Linq para esto?

grid.Rows.OfType<DataGridViewRow>().Last().Selected = true; 
    grid.CurrentCell = grid.Rows.OfType<DataGridViewRow>().Last().Cells.OfType<DataGridViewCell>().First(); // if first wanted 
+0

No, no lo he hecho. Pero no tengo los métodos de extensión 'Last()' y 'First()'. Tengo el uso de System.Linq – Martijn

+0

lo siento, he editado para corregir linq ahora – danijels

+0

Gracias. Intenté su solución pero recibo la misma excepción en esta línea: 'grid.CurrentCell = grid.Rows.OfType (). Last(). Cells.OfType (). Last();' – Martijn

-1

Finalmente, la última fila está vacía porque es la fila vacía con la que el usuario puede agregar una nueva fila. Esta fila no puede ser seleccionada. ¿Has probado grid.Rows.Count - 2? Como alternativa, puede establecer AllowUserToAddRows en falso.

+0

He intentado con su solución, pero no funcionó. – Martijn

+0

Ya tengo esa propiedad configurada en falso ... – Martijn

+0

-1 - eso se llama agarrar pajas, no depurar. –

11

Probar:

dataGridView1.ClearSelection();//If you want 

int nRowIndex = dataGridView1.Rows.Count - 1; 
int nColumnIndex = 3; 

dataGridView1.Rows[nRowIndex].Selected = true; 
dataGridView1.Rows[nRowIndex].Cells[nColumnIndex].Selected = true; 

//In case if you want to scroll down as well. 
dataGridView1.FirstDisplayedScrollingRowIndex = nRowIndex; 

Da siguiente salida: (Última fila, enrollado y seleccionados)

alt text

+0

He intentado esto, pero no funcionó. – Martijn

+0

@Martijn: Probé el código antes de publicarlo. ¿Qué exactamente no funciona? –

+0

En la línea 'dataGridView1.Rows [nRowIndex] .Cells [nColumnIndex] .Selected = true; 'Recibo la molesta Excepción – Martijn

4

Sé que esto puede ser un poco tarde pero puede ser de utilidad para alguien más.

Has probado esto:

grid.Rows.Row[grid.Rows.Count -1].Selected = true;

En las ventanas de mi aplicación por primera vez utilizó su código en mi DataGridView y me dio la misma excepción .. y luego se me ocurrió la noche cuando estaba en mi cama (soy un novato de la programación).

Si escribo como: Rows[Rows.count-1] la primera fila es "0" y "0-1 = -1" por lo que su fuera de rango :)

Luego, cuando he cambiado mi código para Rows.Row[index] funcionó! :)


Una alternativa si utiliza C# 3.0 y superior: echa un vistazo a CellAddress(); ;)

Atentamente

Cuestiones relacionadas