2009-10-22 1 views
6

Ich dachte, das war ein einfaches Problem, aber ich kann keine Informationen im Web finden. Ich Bindung eines ListBox an eine ListBindingSource mit etwa so:ListBox zeigt keine Änderungen an DataSource

List<Customer> customers = MyMethodReturningList(); 

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

customersListBox.DataSource = customersBindingSource; 

Nun, wenn ich aus customers Liste hinzufügen oder löschen, meine ListBox aktualisiert wird (auch ohne ResetBindings auf BindingSource zu verwenden), aber wenn ich ändern jede der Kundenobjekte in der Liste tut es nicht. Der Aufruf ResetBindings hat keine Wirkung. Ich habe sogar meine eigene BindingList implementiert, aber das Verhalten hat sich nicht geändert.
Die Klasse Customer verwendet Eigenschaften für den Zugriff auf und die Änderung von Daten. Sein Inhalt ToString() wird in der Liste angezeigt.

Ich verwende C# in .Net 2.0.

Irgendwelche Ideen?

Dank

Antwort

4

OK, hier ist ein schmutziges fix: wenever Sie die Box Inhalt Datenquelle = null gesetzt aktualisieren müssen, ist es dann erneut binden.

Der Grund, warum es nicht aktualisiert wird, liegt darin, dass die Objekte in der Liste nicht geändert wurden und nur die References des Objekts und nicht deren Inhalte überprüft werden.

+0

Ja, ich glaube, das habe ich am Ende gemacht (ich habe den Code gerade nicht), aber wie du gesagt hast, ist es dreckig. –

+0

Ein weiteres Problem besteht darin, dass die Datenquelle ihre Entwurfszeiteinstellungen z. DisplayMember- und ValueMember-Eigenschaften werden nicht festgelegt. – Softec

2

Es gibt auch einen Fehler in der Liste, der dieses Problem verursachen kann. Wenn Sie den SelectionMode auf None festlegen, wird dieses Problem angezeigt.

Als eine Umgehung Ich setze den Auswahlmodus auf Eins und dann zurück auf keine beim Aktualisieren der Datenquelle.

5

Wenn Sie eine BindingList verwenden Sie brauchen nicht einmal die BindingSource:

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

ich um dieses Problem bekam von Daten-Array konvertiert wird, wenn die Quelle zu aktualisieren. Siehe UpdateData-Methode. Auf diese Weise können Sie Ihr Kombinationsfeld aktualisieren, ohne 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>(); 
} 
0

Ich verstehe, dass diese Frage vor fast 6 Jahren gestellt wurde, aber anders als Workarounds sehe ich hier keine richtige Antwort. Wenn Sie die Eigenschaft eines Elements in einer Objektgruppe ändern, wird das Ereignis für das Element (Objekt) ausgelöst, nicht jedoch für die Objektgruppe. Die Sammlung wird also nicht geändert und aktualisiert gebundene Steuerelemente nicht. Elemente in allen Bindungssammlungen und den meisten generischen Sammlungen wie List<> empfangen 2 Ereignisse, PropertyChanging und PropertyChanged. Wenn eine Eigenschaft des Elements in der Sammlung geändert wird, wird das Ereignis ausgelöst. Sie müssen lediglich einen Ereignishandler hinzufügen, der entweder eine erneute Bindung auslöst oder ein Ereignis auf Collection auslöst.