2010-09-28 46 views
7

Ho qualche problema con l'impostazione dell'ultima riga nella mia vista datagrid selezionata. Seleziono l'ultima riga in questo modo:DatagridView Selezionare l'ultima riga

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) 
    { } 
} 

Quando eseguo questo codice ottengo un'eccezione: IndexOutOfRangeException occurred: Indice-1 non ha un valore.

Quando eseguo il debug della raccolta Rows e della corrispondente collezione Cells, vedo che entrambe le raccolte sono riempite. L'indice esiste anche della collezione Righe e celle.

Non ho idea di cosa sto facendo male qui. Qualcuno che può aiutarmi qui? Thnx

EDIT:

Qui è l'eccezione completo:

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

codice sembra che vada bene. Hai provato a debuggarlo? Su quale riga di codice ottieni l'errore? –

+0

Prova un ** Quick Watch ** per 'grid.Rows [grid.Rows.Count - 1] .Cells [1]' e guarda cosa restituisce. –

+0

@Aseem: la riga è: 'grid.CurrentCell = grid.Rows [grid.Rows.Count - 1] .Cells [1]' – Martijn

risposta

1

tuo blocco 'catturare' per IndexOutOfRangeException è vuoto, e non visualizzerà alcun errore a tutti.

O la tua domanda non è esatta o l'eccezione viene lanciata da qualche altra parte.

EDIT: aver guardato attraverso il vostro stack di chiamate che è stato aggiunto, posso vedere che l'errore è, infatti, non essere gettati qui, ma piuttosto nelle CurrencyManagerCurrent/Item le proprietà di classe, che è in definitiva essere attivato dalla chiamata al setter CurrentCell.

Bottom line: il problema non è in questo codice; l'eccezione viene generata da un altro pezzo di codice attivato dall'impostazione della cella corrente.

+0

Viene lanciata un'eccitazione in modalità di debug. Il codice smette di funzionare e VS sta evidenziando. Ma non è questo il punto. Il punto è, perché è stata lanciata l'eccezione? – Martijn

+0

Vorrei usare la finestra "Immediata" per confermare il valore di grid.Rows.Count, quindi provare ad accedere a grid.Rows [0] o qualsiasi numero usando un intero letterale, solo per essere sicuro. Sospetto che il codice qui non sia una copia esatta del codice che sta causando l'eccezione, e da qualche parte tra quello e quello che * pensi * che il tuo codice sta facendo è l'errore. –

+0

Nella finestra immediata ho righe e celle nelle raccolte – Martijn

2

Avete pensato di utilizzare Linq per questo?

+0

No, non ho. Ma non ho i metodi di estensione 'Last()' e 'First()'. Ho usato System.Linq – Martijn

+0

scusate, ho modificato per correggere linq ora – danijels

+0

Grazie. Ho provato la tua soluzione ma ottengo la stessa eccezione su questa riga: 'grid.CurrentCell = grid.Rows.OfType (). Last(). Cells.OfType (). Last();' – Martijn

-1

Eventualmente l'ultima riga è vuota perché è la riga vuota con cui l'utente può aggiungere una nuova riga. Questa riga non può essere selezionata. Hai provato grid.Rows.Count - 2? In alternativa, è possibile impostare AllowUserToAddRows su false.

+0

Ho provato la soluzione, ma non ha funzionato. – Martijn

+0

Ho già questa proprietà impostata su false .. – Martijn

+0

-1 - che si chiama stringere a cannucce, non eseguire il debug. –

11

Prova:

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; 

Dà seguente output: (ultima riga, scorrere e selezionati)

alt text

+0

Ho provato questo, ma non ha funzionato. – Martijn

+0

@Martijn: ho testato il codice prima di postare. Che cosa esattamente non funziona? –

+0

Sulla riga 'dataGridView1.Rows [nRowIndex] .Cells [nColumnIndex] .Selected = true; 'Ottengo la fastidiosa eccezione – Martijn

4

So che questo può essere un po 'in ritardo, ma può essere utile a qualcun altro.

Hai provato questo:

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

Nelle mie finestre app ho usato il codice in mia datagridview e ho avuto la stessa eccezione .. e poi è venuto da me di notte, quando ero in il mio letto (sono un principiante della programmazione).

Se scrivo come: Rows[Rows.count-1] la prima riga è "0" e "0-1 = -1" per cui il suo fuori campo :)

Poi, quando ho cambiato il mio codice per Rows.Row[index] ha funzionato! :)


Un'alternativa se si utilizza C# 3.0 e versioni successive: controllare CellAddress(); ;)

Sinceramente

Problemi correlati