2009-04-29 6 views
6

Ich erhalte die folgende Nachricht, wenn ich versuche, das letzte Element in einem Datagridview zu entfernen.InvalidOperationException auf Databinding beim Entfernen des letzten Elements in der Liste

DataBinding kann keine Zeile in der Liste finden, die für alle Bindungen geeignet ist.

Ich habe meine verbindliche Einrichtung wie folgt.

ExtendedBindingList<MyClass> bl = new ExtendedBindingList<MyClass>(GetDataFromDB()); 
BindingSource bs = new BindingSource(); 
bs.DataSource = bl; 
dgv.DataSource = bs; 

ExtendedBindingList ist nur etwas Einfaches ich zusammen Sortierung und Filterung zu implementieren warf und einige Grundzustand Ausdauer. dgv ist das DataGridView. GetDataFromDB gibt eine Liste von MyClass zurück.

Das Problem entsteht erst, wenn ich versuche, das letzte Element aus dem Datagridview zu entfernen Verwendung:

bs.RemoveCurrent(); 

, die zu allen anderen Zeiten funktionieren. Mein einziger Hinweis für eine Lösung ist, alle Bindungen zu entfernen und sie erneut anzuwenden, aber das scheint keine ideale Lösung zu sein.

BEARBEITEN Die Ausnahme wird nur ausgelöst, nachdem die BindingList den letzten Eintrag erfolgreich entfernt hat. Es wird in externen Code geworfen, so dass ich nicht genau sagen kann, was es wirft.

Also, hier bin ich und bitte SO um etwas Hilfe :).

Vielen Dank im Voraus, Justin

Antwort

0

Hier ist, wie ich Zeile aus einem Raster ausgewählt entfernen:

private void btnDelete_Click(object sender, EventArgs e) 
{ 
    if (grid.CurrentRow == null) return; 
    var selectedItem = grid.CurrentRow.DataBoundItem as PartGroup; 
    if (selectedItem != null && 
    UIHelper.ShowQuestion("Are you sure you want to delete selected row?") == System.Windows.Forms.DialogResult.Yes) 
    { 
    groups.Remove(selectedItem); 
    } 
}

Gruppen ist mein BindingListEx (Of T).

Ich hoffe, es hilft.

+0

Ich benutze ein DataGridView nicht ein Raster, aber das ist im Wesentlichen, was ich auch verwende. Es funktioniert jedes Mal, außer wenn ich den letzten Gegenstand entferne. –

+0

Es ist eine DataGridView in meinem Beispiel. BindingSource wird auch verwendet, aber ich lösche von BindingListEx, nicht von BindingSource. Probieren Sie diesen Code einfach aus. Ich denke auch, dass Ihr Problem irgendwie auf die letzte Zeile bezogen ist, die für das schnelle Hinzufügen von Zeilen (AllowUserAddNewRows = true) ist. Ich erinnere mich, dass ich ein Problem damit hatte und entschied mich dann, es auszuschalten (setze AllowUserAddNewRows auf false). – nightcoder

+0

Hmm, ich werde es versuchen. –

0

[Leider nicht wirklich eine Antwort, aber ich finde, dass das wertvoll ist, da keine Antwort gegeben wurde.]

Ich war genau die gleiche Situation mit .NET Compact Framework 2.0 zu bekommen. Beim Testen wurde der Wert bis zu dem Punkt zurückverfolgt, an dem mit NumericUpDown.DataBindings.Add() das Steuerelement an die Quelle gebunden wurde. Nach diesem Zeitpunkt würde die Verwendung von RemoveCurrent() den Fehler erzeugen, wenn das Element das letzte in der Quelle wäre. Vor dieser Bindung (oder wenn sie übersprungen wurde), würde der Fehler niemals auftreten.

Andere Steuerelemente waren an dieselbe Quelle gebunden - TextBox und ComboBox -, aber sie verursachten dieses Verhalten nicht. Nur das NumericUpDown-Steuerelement.