2009-05-30 10 views
7

Ich habe eine Datagridview, die wir DataGridViewExample nennen werden.Datagridview verursacht IndexOutOfRangeException beim Klicken auf

Mein Objekt (die ungewöhnlich Datentypen ist, weil meine Datenbank SQLite ist):

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

Hier ist der relevante Code:

//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(); 
} 

Wenn MyForm mit einem .ShowDialog aufgerufen wird, zeigt sich, gut und zeigt mein DataGridView Beispiel gut an. Wie Sie aus dem Code lesen können, ist das ExampleList zunächst leer, so dass es nur eine leere Datagridview mit 4 Spalten zeigt: Vnr, Name, Preis & Betrag. Wenn ich drinnen reinklicke usw. passiert nichts - so funktioniert alles wie geplant, so weit.

Jedes Mal, wenn ich AddtoDataGridViewExample() rufe, fügt das neue Objekt dem Datagridview hinzu, und das datagridview wird aktualisiert, wobei alle bisher hinzugefügten Objekte aufgelistet werden (sie zeigen sich als Zeilen, wieder wie geplant).

Denken Sie daran, dass ich gerade gesagt habe, dass nichts passiert ist, wenn Sie innerhalb DataGridViewExample geklickt haben, bevor ich AddtoDataGridViewExample() aufgerufen habe? Nun, nachdem ich einmal oder mehr AddtoDataGridViewExample() aufgerufen habe, stürzt das Programm ab, wenn ich in DataGridViewExample klicke (zum Beispiel: der Benutzer möchte eine Zeile auswählen). Es wirft eine IndexOutOfRangeException und spricht über einen Index -1. Es wirft auch die Ausnahme in der anderen Form, in der Zeile, wo ich MyForm mit .ShowDialog() aufrufen;

Ich bin wirklich auf diesem stecken, haben Sie eine Ahnung, was los ist ?? Mein einziger Hinweis ist, dass ich glaube, dass die Aktualisierung der Datenquelle DataGridViewExample die Ursache des Problems sein könnte. Andere wichtig Hinweis: Ich habe noch keine Ereignisse an meine DataGridViewExample gebunden. So können Sie diese Idee regeln.

Hier werden alle Eigenschaften s‘DataGridViewExample:

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

Wo ist der Code, der das Click-Ereignis behandelt? In der Regel tritt diese Ausnahme auf, weil Sie ein click -Ereignis verarbeiten und dann versuchen, die ausgewählte Zeile abzurufen, wenn keine Zeile ausgewählt ist. Das Auswählen einer Zeile und das Klicken auf das Raster schließen sich gegenseitig aus. Also, wo ist der Code, der das Click-Ereignis behandelt, das die Ausnahme auslöst? – Josh

+0

Ich habe noch irgendwelche Ereignisse zu DataGridViewExample hinzugefügt, das ist der alarmierende Teil :(Also, wenn überhaupt, ist es ein inbuildt Ereignis, das es verursacht. – CasperT

Antwort

17

ich das Click-Ereignis erraten versucht, die aktuell ausgewählte Zeile und tun etwas mit ihm zu bekommen, während dataGridViewExample.DataSource = null; die Datenquelle löscht und die aktuell ausgewählte Zeile wird null .

Wenn Sie DataGridView.DataSource auf die Liste setzen, müssen Sie sie nicht auf null zurücksetzen, aktualisieren und auf die Liste zurücksetzen (und erneut aktualisieren), um die Änderungen anzuzeigen. Es wird ausreichen, nur die DataGridView zu aktualisieren.

Sie können einfach auch anstelle eines List<T> ein BindingList<T> Objekt versuchen verwenden, die automatisch das Raster der internen Änderungen in Kenntnis setzen wird (Hinzufügen und Entfernen von Elementen), und es gibt auch eine INotifyPropertyChanged Schnittstelle, die Sie auf Ihrem MyObject Klasse implementieren können, dass Jede Eigenschaft wird in einem Objekt im Raster angezeigt (für alle Änderungen am Objekt im Code und nicht am Gitter selbst).

+0

Das klingt extrem interessant. Könnten Sie einige Codebeispiele zeigen? Insbesondere, wie Sie die Bindung verwenden Liste und wie ich die Aktualisierung in meiner Methode aufrufen sollte – CasperT

+0

Ich änderte die Liste in die Bindungsliste, entfernte alle aktualisieren Code und fügte eine einzige Aktualisierung hinzu.Alles scheint perfekt zu funktionieren, Vielen Dank !! Eine schnelle Anfrage obwohl: Könnten Sie eine zeigen Codebeispiel, wie man ein bestimmtes Objekt aus der Bindungsliste entfernt? – CasperT

+0

Nevermind, dachte alles aus. Nochmals vielen Dank – CasperT

0

Haben Sie versucht, den Debugger auszuführen und zu brechen, wenn InedxOutOfRangeException ausgelöst wird, um zu sehen, wo die Ausnahme ausgelöst wird?

Wählen Sie Debug> Ausnahmen, dann gibt es eine Schaltfläche Suchen im Dialogfeld, so dass Sie nicht alle Möglichkeiten durchsuchen müssen.

+1

Aus irgendeinem Grund funktioniert das nicht. Ich habe sie alle überprüft und als mir das passierte, brach an der Linie, wo ich ShowDialog anrief, das Visual Studio aus. –

0

Ich hatte eine ähnliche Situation. Ich habe DataGridView eine generische Liste von bestimmten Objekten zugewiesen. Dann habe ich null auf DataSource und danach auf Refresh gesetzt. Danach ordne ich der DataSource eine Liste von Objekten zu. Während auf Raster geklickt wurde, trat Laufzeitfehler IndexOutOfRange auf. Meine Lösung bestand darin, diesem Gitter eine neue leere Liste meines Objekts zuzuweisen und zu aktualisieren. Nach Änderungen in meiner Arbeitsliste weise ich DataSource zu und rufe Refresh auf. Jetzt funktioniert es ohne Abstürze. Bitte schauen Sie auf meinem Code vor:

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

Und jetzt auf meinem Code nach:

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