Das folgende Bild zeigt, wie mein Code funktioniert. Wenn ich Knopf2 drücke, wird das Listenfeld aktualisiert, aber nicht, wenn ich Knopf1 drücke. Warum?Winforms-Listenfeld wird nicht aktualisiert, wenn sich die gebundenen Daten ändern
pseudo code http://i44.tinypic.com/mj69oj.gif
Ist das Problem damit verbundene Threading? Wenn ja, wo sollte ich den Aufruf zu (Begin) Invoke hinzufügen?
Eine interessante Sache zu beachten ist, dass, wenn ich zuerst Button1 und dann Button2 die Daten, die durch den Klick Button1 erzeugt werden, wenn ich auf Button2 klick. Es sieht also so aus, als würden die von doFoo erzeugten Daten irgendwo gepuffert und dann in die Listbox geschoben, sobald ich Button2 drücke.
EDIT:
versuchte ich AddNumber das Formular Code hinzufügen, und fügte hinzu, um einen Anruf zu berufen, wenn listBox1.InvokeRequired true zurück. Dies löst das Problem, ist aber nicht das schönste Design. Ich möchte nicht, dass die GUI sich darüber Gedanken machen muss, wie man Elemente zu einer Liste hinzufügt, die Teil des Modells ist.
Wie kann ich die Logik hinter dem Hinzufügen zu der Liste innerhalb der Listenklasse beibehalten, während die GUI immer noch aktualisiert wird, wenn sich die Liste ändert?
EDIT 2:
Jetzt, wo wir bestätigt haben, dass dies ein Threading-Problem ist ich das Bild aktualisiert haben enger an das Design des eigentlichen Code reflektieren ich arbeite.
Während Luceros Vorschlag immer noch das Problem löst, habe ich auf etwas gehofft, das die Form nicht benötigt, um etwas über die DLL oder CDllWrapper zu wissen.
Das Modell (ListBoxDataBindingSource usw.) sollte gar nichts über die Ansicht (Listenfelder, Knöpfe, Etiketten usw.)
Ich verstehe, was das Problem ist, jetzt müssen wir nur mit einer guten Lösung kommen :) Ich versuche, dies nach dem MVC-Muster zu entwerfen, so dass ListBoxDa taBindingSource (Teil des Modells) wissen über ein Steuerelement (Teil der Ansicht) wird im Allgemeinen als schlechte Praxis angesehen. – Tobbe
Nun, es ist nicht wirklich über das Steuerelement zu wissen, sondern muss nur heißen, um den Add-Aufruf zum richtigen Thread zu marshalieren. Sie könnten Ihre eigene Marshalling-Klasse erstellen, die das Steuerelement kennt und an die Liste übergeben wird, sodass dieser Aspekt ordnungsgemäß ausgeblendet wird. – Lucero
(* @ Tobbe: * Vielleicht [diese Antwort] (http://stackoverflow.com/questions/3381536/winforms-data-binding-to-business-objects-in-a-multi-threaded-scenario-without-in-)/3381685 # 3381685) auf eine meiner vorherigen Fragen - [Winforms-Datenbindung an Geschäftsobjekte in einem Multithread-Szenario ohne InvokeRequired?] (Http://stackoverflow.com/q/3381536/240733) - wird angewendet hier.) – stakx