2009-05-30 4 views
7

Ho una vista datagrid che chiameremo dataGridViewExample.Datagridview che causa IndexOutOfRangeException quando si fa clic su

Il mio scopo (i tipi di dati non comuni è perché il mio database è SQLite):

class MyObject 
{ 
    public Int64 Vnr { get; set; } 
    public string Name { get; set; } 
    public Single Price { get; set; } 
    public int Amount { get; set; } 
} 

Ecco il codice rilevante:

//This form gets called with a .ShowDialog(); in my form1. 

private List<MyObjecte> ExampleList = new List<MyObject>(); 

public MyForm() 
{ 
    dataGridViewExample.DataSource = OrdreInkøbsListe; 
} 


private void AddtoDataGridViewExample() 
{ 
    //Add a new MyObject to the list 
    ExampleList.Add(new myObject() 
       { 
        Vnr = newVnr, 
        Amount = newAmount, 
        Price = newPrice, 
        Name = newName 
       }); 

    //refresh datasource 
    dataGridViewExample.DataSource = null; 
    dataGridViewExample.Refresh(); 
    dataGridViewExample.DataSource = OrdreInkøbsListe; 
    ddataGridViewExample.Refresh(); 
} 

Quando MyForm viene chiamato con un .ShowDialog, si presenta bene e visualizza il mio esempio DataGridView bene. Come puoi leggere dal codice, lo ExampleList è inizialmente vuoto, quindi mostra solo una vista datagrid vuota con 4 colonne: Vnr, Nome, Prezzo & Quantità. Se clicco dentro di esso ecc. Non succede nulla, quindi tutto funziona come pianificato, finora.

Ogni volta che chiamo AddtoDataGridViewExample() aggiunge il nuovo oggetto a Datagridview e la vista datagrid si aggiorna, elencando tutti gli oggetti aggiunti fino a quel momento (si mostrano come righe, sempre secondo il piano).

Ora, ricorda che ho appena detto che non è successo nulla se hai fatto clic all'interno di DataGridViewExample prima che io abbia chiamato AddtoDataGridViewExample()? Bene, dopo aver chiamato AddtoDataGridViewExample() una o più volte, il programma si bloccherà se clicco all'interno di DataGridViewExample (ad esempio: gli utenti vogliono selezionare una riga). Getta un IndexOutOfRangeException e parla di un indice -1. Genera anche l'eccezione nell'altro modulo, sulla riga dove chiamo MyForm con .ShowDialog();

Sono davvero bloccato su questo, avete qualche idea di cosa c'è che non va ?? Il mio unico indizio è che ritengo che l'aggiornamento dell'origine dati di DataGridViewExample potrebbe essere la causa del problema. Altro importante nota: Ho ancora associato eventi al mio DataGridViewExample. Quindi puoi escludere questa idea.

Ecco proprietà tutti DataGridViewExample 's:

this.dataGridViewExample.AllowUserToAddRows = false; 
this.dataGridViewExample.AllowUserToDeleteRows = false; 
this.dataGridViewExample.AllowUserToResizeColumns = false; 
this.dataGridViewExample.AllowUserToResizeRows = false; 
this.dataGridViewExample.AutoSizeColumnsMode = System.Windows.Forms.DataGridViewAutoSizeColumnsMode.Fill; 
this.dataGridViewExample.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize; 
this.dataGridViewExample.Location = new System.Drawing.Point(591, 53); 
this.dataGridViewExample.MultiSelect = false; 
this.dataGridViewExample.Name = "dataGridViewExample"; 
this.dataGridViewExample.ReadOnly = true; 
this.dataGridViewExample.RowHeadersVisible = false; 
this.dataGridViewExample.SelectionMode = System.Windows.Forms.DataGridViewSelectionMode.FullRowSelect; 
this.dataGridViewExample.ShowEditingIcon = false; 
this.dataGridViewExample.Size = new System.Drawing.Size(240, 150); 
this.dataGridViewExample.TabIndex = 31; 
+1

Dove è il codice che gestisce l'evento click? In genere questa eccezione si verifica perché si sta gestendo un evento click e quindi si tenta di ottenere la riga selezionata quando non è selezionata alcuna riga. Avere selezionato una riga e fare clic sulla griglia si escludono a vicenda. Quindi, dov'è il codice che gestisce l'evento click che genera l'eccezione? – Josh

+0

Ho ancora aggiunto eventi a dataGridViewExample, ovvero la parte allarmante :(quindi semmai è un evento inbuild che lo sta causando – CasperT

risposta

17

Credo che l'evento click cerca di ottenere la riga attualmente selezionata e fare qualcosa con esso, mentre dataGridViewExample.DataSource = null; cancella l'origine dati, e la riga attualmente selezionata diventa nullo .

Se si imposta DataGridView.DataSource nell'elenco, non è necessario reimpostarlo su null, aggiornarlo e reimpostarlo nuovamente nell'elenco (e aggiornarlo di nuovo) per visualizzare le modifiche. Sarà sufficiente aggiornare semplicemente lo DataGridView.

si può anche solo provare a utilizzare un BindingList<T> oggetto invece di un List<T>, che ne informa automaticamente la griglia dei suoi cambiamenti interni (Aggiunta e rimozione di elementi), e c'è anche un'interfaccia INotifyPropertyChanged è possibile implementare sulla vostra classe MyObject, che renderà ogni modifica di proprietà in un oggetto mostra sulla griglia (per qualsiasi modifica apportata all'oggetto nel codice e non attraverso la griglia stessa).

+0

Questo sembra estremamente interessante.Potresti mostrare alcuni esempi di codice? Soprattutto come usare l'associazione elenco e come dovrei chiamare l'aggiornamento nel mio metodo – CasperT

+0

Ho cambiato l'elenco in lista vincolante, rimosso tutto il codice di aggiornamento e aggiunto un singolo aggiornamento.Tutto sembra funzionare perfettamente, Grazie mille !! Una richiesta veloce però: potresti mostrare un codice esempio di come rimuovere un determinato oggetto dalla lista vincolante? – CasperT

+0

Non importa, capito tutto. Grazie ancora – CasperT

0

Hai provato a eseguire il debugger e interrompi quando viene lanciato InedxOutOfRangeException per vedere dove viene generata l'eccezione?

Selezionare Debug> Eccezioni, quindi c'è un pulsante Trova nella finestra di dialogo in modo da non dover sfogliare tutte le possibilità.

+1

Per qualche motivo che non funziona. Li ho tutti controllati e quando è successo a me è apparso lo studio visivo alla linea in cui ho chiamato ShowDialog sul modulo di contenimento. –

0

Ho avuto una situazione simile. Ho assegnato un elenco generico di determinati oggetti a DataGridView. Quindi stavo impostando null su DataSource e dopo quell'aggiornamento. Successivamente, assegno la lista di oggetti a DataSource. Mentre si è cliccato sulla griglia durante l'errore di runtime si è verificato IndexOutOfRange. La mia soluzione è stata quella di assegnare una nuova lista vuota del mio oggetto a quella griglia e aggiornare e dopo le modifiche sul mio elenco di lavoro che assegno a DataSource e chiamare Aggiorna. Ora funziona senza arresti anomali. Si prega di guardare il mio codice prima:

grid.DataSource = null; 
grid.Refresh(); 
if(cases.Count() > 0) 
{ 
    grid.DataSource = cases; 
    grid.Refresh(); 
}    

E ora il mio codice dopo:

grid.DataSource = new List<MyCase>(); 
grid.Refresh(); 
//do something with cases 
if(cases.Count() > 0) 
{ 
    grid.DataSource = cases; 
    grid.Refresh(); 
}