Seltsames problem mit ListBox.DataSource
Ich Schreibe eine Windows-Anwendung und mit einem Listbox-Steuerelement. Ich entwickle mit Visual Studio C# 2008 Express Edition.
Habe ich ein Daten-Objekt, das so ähnlich aussieht, wie diese
public class RootObject
{
public List<SubObject> MySubObjects{ get; set;}
}
Ich habe eine ListBox auf meiner form, und auch eine Eigenschaft "MyRootObject", die es, offenbar ist, hält RootObject. Wenn die Steuerung initialisiert wird, habe ich:
_listBox.DataSource = MyRootObject.MySubObjects;
Nun, wenn das Formular geladen wird, ich Debuggen und zu sehen, dass die DataSource korrekt eingestellt. Aber es wird nichts angezeigt. Ich habe überschrieben Unterobjekt ToString () - Methode und es ist nicht einmal genannt. Ich habe versucht, _listBox.DisplayMember eine Eigenschaft von Teilobjekt nur zu sehen, wenn es irgendein problem gibt, aber immer noch nichts. Ich habe versucht, den Aufruf _listBox.Update() und _listBox.Refresh() nach Festlegung der DataSource, aber noch keine Liebe. Die DataSource hat alle Daten... es ist nur die Verweigerung, um es anzuzeigen.
Also beim Debuggen, habe ich mich gefragt WTF und ich beschlossen, nur das zu tun,
_listBox.DataSource = new List<SubObject>{ new SubObject(), new SubObject() };
Sicher genug, das hat funktioniert, und ich sehe zwei Dinge aufgelistet die in meiner listbox.
Also dann, wirklich neugierig, ich beschlossen, zu versuchen, kopieren Sie die Liste der Objekte und setzen, dass in der listbox, etwa so:
_listBox.DataSource = MyRootObject.MySubObjects.ToArray();
Dieser funktioniert! Und es ist ein workaround für mein problem jetzt... aber sehr lästig. Weiß jemand, warum brauche ich im Grunde kopieren Sie die Liste der Objekte wie dieses, um es zu arbeiten, anstatt nur die Einstellung der _listBox.DataSource = MyRootObject.MySubObjects; ? Wieder, die DataSource hat für alle die richtigen Daten entweder Weg, nachdem Sie es... es ist nur, wenn es kopiert Daten, es zeigt tatsächlich, und wenn es nicht ist, wird es nicht angezeigt.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sux0r ich weiß, aber das funktioniert.
(ursprünglich gefunden Antwort hier)
Aus der Spitze von meinem Kopf, das ist, weil die
ListBox.DataSource
Eigenschaft muss etwas beinhalten, die dieIList
- Schnittstelle. Ihre generischenList<SubObject>
nicht implementiertIList
; es setztIList<T>
(in derSystem.Collections.Generic
namespace).Array
Objekte, auf der anderen Seite haben Erben vonIList
, so dass die übergabe der Daten über diese Art von Objekt arbeiten.Könnten Sie versuchen, ziehen Sie einen
Enumerator
(die auch implementiertIList
) aus IhremList<SubObject>
Objekt und stecken Sie, dass in. Wenn es funktioniert, dann ist die Frage, die ich beschrieben habe, ist dein problem. Wenn nicht, dann spreche ich aus meinem Hut.Ist dies in der Tat der Fall, ich bin überrascht, dass drängeln in einer nicht unterstützten Objekt-nicht eine Ausnahme werfen.
so weit, dass ich weiß, Wann immer Sie wollen eine Sammlung zu einem
müssen Sie die DisplayMember und ValueMember. DisplayMember und ValueMember sind gefüllt mit der Eigenschaft name der Klasse, in der Sammlung zugeordnet ist, die listbox/combobox. Ex.
root.MySubObjects gibt Liste der Unterobjekt, und das Unterobjekt hat Eigenschaften genannt DisplayProperty und ValueProperty, ex.
Ich glaube, du musst Bind-Methode aufrufen, nachdem die Zuweisung an die Liste im Feld Daten-Quelle
so etwas wie _listBox.DataSource.bind()
und haben Sie Ihre listbox verschwunden
könnten Sie versuchen, und verwenden Sie eine BindingSource
( http://msdn.microsoft.com/en-us/library/system.windows.forms.bindingsource.aspx )
dazwischen die Listbox und Ihrer Sammlung. Bindingsources behandelt eine Reihe von Sachen, und auch Suspend/ResumeBinding properies, die nützlich sein können bei der Aktualisierung der Liste
könnte man auch versuchen, aus wpf als seine databinding ist weit überlegen, dass der winforms 🙂 aber vielleicht ist das ja auch nicht möglich in deinem Fall
Ich glaube, Sie müssen rufen Sie _listbox.DataBind(); nach Zuordnung der datasource.
Allerdings habe ich noch nie verwendet, eine Eigenschaft, die als eine Datenquelle vor, ich habe nur die verwendeten Methoden. Haben Sie versucht, ändern Sie Ihre Eigenschaft auf eine Methode, um zu sehen, ob das das problem ist?
Könnten Sie versuchen,
statt. BindingList implementiert einige Schnittstellen als Liste, die essentiell für das DataBinding.
Habe ich eine spezielle Regel für Probleme wie dieses, dass ich immer versuche mich zu erinnern, vor der Verschwendung einen ganzen Tag hämmern auf Sie (glauben Sie mir, ich habe viele Tage hämmern!). Die Regel ist: wenn das system-Verhalten ist wirklich merkwürdig, die zugrunde liegende Ursache muss sehr dumm sein. Als intelligente Programmierer, wir haben eine Tendenz zu suchen, für esoterische Ursachen oder Fehler im framework-code zu erklären, unsere Probleme. Manchmal ist die Antwort ist, dass wir waren in Eile und machte einen sorglosen Fehler, den wir noch nicht gefangen.
Zitieren Sherlock Holmes, "wenn Sie entfernt haben, das Unmögliche, was immer bleibt, egal wie unwahrscheinlich, die Wahrheit sein muss". In diesem Fall, das unwahrscheinliche die Wahrheit ist, dass die MySubObjects Eigenschaft von MyRoot-Objekt null ist.