7 Stimmen

ListBox zeigt keine Änderungen der DataSource an

Ich dachte, das sei ein einfaches Problem, aber ich kann im Internet keine Informationen finden. Ich binde eine ListBox an eine List mit BindingSource etwa so:

List<Customer> customers = MyMethodReturningList();

BindingSource customersBindingSource = new BindingSource();
customersBindingSource.DataSource = customers;

customersListBox.DataSource = customersBindingSource;

Wenn ich jetzt etwas hinzufüge oder lösche aus customers Liste, meine ListBox aktualisiert wird (auch ohne Verwendung von ResetBindings auf BindingSource ), aber wenn ich eines der Kundenobjekte in der Liste ändere, tut es das nicht. Aufruf von ResetBindings hat keine Wirkung. Ich habe sogar meine eigene BindingList aber das Verhalten hat sich nicht geändert.
Die Customer Klasse verwendet Eigenschaften für den Zugriff auf und die Änderung von Daten. Ihre ToString() Der Inhalt wird in der Liste angezeigt.

Ich verwende C# in .Net 2.0.

Irgendwelche Ideen?

Danke

5voto

Chuck Wilbur Punkte 2420

Wenn Sie eine BindingList brauchen Sie nicht einmal die BindingSource :

BindingList<Customer> customers = new BindingList<Customer>(MyMethodReturningList());
customersListBox.DataSource = customers;

4voto

Michael Punkte 49

OK, hier ist eine schmutzige Lösung: Wann immer Sie den Inhalt des Feldes aktualisieren müssen, setzen Sie datasource = null, dann binden Sie es erneut.

Der Grund dafür, dass die Liste nicht aktualisiert wird, ist, dass sich die Objekte in der Liste nicht geändert haben und nur die Verweise auf die Objekte und nicht deren Inhalt geprüft werden.

3voto

Es gibt auch einen Fehler in der Listbox, der dieses Problem verursachen kann. Wenn Sie den SelectionMode auf Keine dieses Problem auftritt.

Als Ausweichlösung setze ich den Auswahlmodus auf Eins und dann wieder auf Kein, wenn ich die Datenquelle aktualisiere.

0voto

Softec Punkte 987

Ich habe dieses Problem umgangen, indem ich die Daten beim Aktualisieren der Quelle in ein Array konvertiert habe. Siehe UpdateData-Methode. Auf diese Weise können Sie Ihre ComboBox aktualisieren, ohne die ComboBox-Einstellungen zu verlieren.

class Person {
   public int Id {get; set; }
   public string FirstName{ get; set; }
   public string SurName {get; set; }
}

public Form1()
{
    InitializeComponent();
    comboBox1.DisplayMember = "FirstName";
    comboBox1.ValueMember = "Id";
    comboBox1.DataSource = m_PersonList;
}

public void UpdateData() {
    m_PersonList[0].FirstName = "Firstname1";
    comboBox1.DataSource = m_PersonList.ToArray<Person>();
}

0voto

ArtK Punkte 1089

Ich verstehe, dass diese Frage vor fast 6 Jahren gestellt wurde, aber abgesehen von Workarounds sehe ich hier keine richtige Antwort. Wenn Sie die Eigenschaft eines Elements in einer Sammlung ändern, wird das Ereignis für das Element (Objekt) ausgelöst, aber nicht für die Sammlung. Die Sammlung sieht also keine Änderung und aktualisiert die gebundenen Steuerelemente nicht. Elemente in allen bindenden Sammlungen und den meisten generischen Sammlungen wie List<> 2 Ereignisse erhalten, PropertyChanging und PropertyChanged . Wenn eine Eigenschaft des Elements in der Sammlung geändert wird, wird das Ereignis ausgelöst. Alles, was Sie tun müssen, ist einen Event-Handler hinzuzufügen, der entweder eine neue Bindung auslöst oder ein Ereignis auf der Collection .

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X