Ich habe eine ComboBox, die an eine DataSource gebunden ist. Ich möchte Elemente der ComboBox basierend auf bestimmten Bedingungen dynamisch hinzufügen. Also habe ich die Optionen zu einer neuen Liste hinzugefügt und ändere dann die DataSource der ComboBox wie folgt:
%Vor% Dann überprüfe ich cbo.Items.Count
, und es wurde nicht erhöht - es ist nicht gleich der Anzahl der DataSource. Irgendwelche Ideen was ich hier machen kann? Beachten Sie, dass dies WinForms und nicht asp.net ist.
Danke
Wenn dieses Problem bei einer dynamisch hinzugefügten Combobox auftritt, müssen Sie sicherstellen, dass Sie die Combobox den Steuerelementen eines Containers im Formular hinzufügen.
Durch Hinzufügen von "this.Controls.Add (cbo);" zu dem Code vor dem Festlegen der Datenquelle, verschwindet das Problem.
Haben Sie die Zählung sofort oder zu einem späteren Zeitpunkt überprüft? Es besteht die Möglichkeit, dass die ComboBox ihren Inhalt nicht aktualisiert, bis ein Vorgang wie eine Aktualisierung der Benutzeroberfläche stattfindet und daher die Zählung bis zu diesem Zeitpunkt deaktiviert ist.
Wenn dies der Fall ist, wenn Sie die DataSource aktualisieren, bevor das Handle für das Kombinationsfeld erstellt wird. Ich habe den Code ein wenig auf dem Reflektor gegraben und es scheint, dass die Elemente in diesem Fall nicht aktualisiert werden, bis die ComboBox tatsächlich erstellt und gerendert wird.
Bevor Sie cbo.SelectedValue
setzen oder sich auf Items
verlassen, um auf dem neuesten Stand zu sein, rufen Sie
und Items
werden neu berechnet.
Das Problem ist, dass SelectedValue
/ SelectedIndex
, die WinForms-Eigenschaften sind, nur die Werte akzeptieren, die gemäß der Items
-Liste zulässig sind, aber diese erst nach der GUI-Interaktion erstellt werden, dh nach der Instantiierung eines " echtes "Windows GUI Combo-Box, dh nach Erhalt eines Windows-Handle für die Combobox.
CreateControl
erzwingt die Erstellung des Windows-Handles, egal was passiert.
Es gibt auch ein "DataSourceChanged" -Event ... vielleicht könnte das helfen
Nur um zu klären, rufen Sie die Methode count () auf Nach dem Aufrufen der Methode databind ()
Dieser Code produziert 2 in der Nachrichtenbox für mich, können Sie es ausprobieren und sehen, wie es sich für Sie verhält?
Sie können es in eine Konsolenanwendung einfügen und einen Verweis auf System.Windows.Forms
und System.Drawing
hinzufügen.
comboBox1.DataSource = somelist;
int c1 = comboBox1.DataSource.Count; // noch null
BindingContext dummy = this.comboBox1.BindingContext; // Aktualisierung jetzt erzwingen!
int c2 = kombinierterBox1.DataSource.Count; // jetzt ist es gleich somelist.Count
Ich hatte das gleiche Problem (Ich arbeite mit VS 2005).
Sie müssen die DataSource auf null setzen, die Elemente löschen, die Datenquelle neu zuweisen, Elemente anzeigen und bewerten.
ZB
cbo.DataSource = null;
cbo.Items.Clear ();
cbo.DataSource = cbos;
cbo.DisplayMember="Titel";
cbo.ValueMember="Wert";
Alter Thread, aber ich habe einige dieser Lösungen ausprobiert, den Bindungskontext unterbrochen / wieder aufgenommen, eine Bindungsquelle gebunden und zurückgesetzt und einfach das Formular neu geladen. Keine funktionierte, um mein Steuerelement mit den neu gebundenen Daten zum Zeitpunkt meiner .datasource-Einstellung zu aktualisieren (mein items.count war leer, genau wie das OP).
Dann erkannte ich, dass meine Combobox auf einer Registerkarte war, die am Anfang des Codes entfernt und später wieder hinzugefügt wurde (nach meiner Datenbindung). Das Bindungsereignis trat erst auf, als > die Registerkarte erneut hinzugefügt wurde.
Scheint im Nachhinein offensichtlich, aber es war sehr schwierig, zur Laufzeit zu erkennen, aufgrund der Reihenfolge der Aufrufe und der Unfähigkeit zu sehen, wann sich die Dinge änderten.
Ba Salam,
Sie können die Benutzeroberfläche einfach mit der Funktion preformLayout () aktualisieren;
Beispiel:
comboBox1.performLayout ();
Grüße mohsen s
Bitte versuchen Sie es:
%Vor%Ich denke, deine Frage ist dieselbe wie heute.
Tags und Links c# data-binding winforms combobox