ComboBox items.count stimmt nicht mit Datenquelle (C #) überein

8

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

    
Madeleine 20.05.2009, 13:11
quelle

13 Antworten

6

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.

    
Madeleine 10.11.2009, 15:27
quelle
12

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.

    
JaredPar 20.05.2009 13:14
quelle
5

Ich habe die Ursache gefunden ...

Ich habe die cbo.Datasource = null Zeile .. und am Ende eine cbo.Invalidate () hinzugefügt. Dies hat das Problem gelöst.

Danke allen für den Rat.

    
Madeleine 20.05.2009 13:34
quelle
4
%Vor%

Bevor Sie cbo.SelectedValue setzen oder sich auf Items verlassen, um auf dem neuesten Stand zu sein, rufen Sie

auf %Vor%

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.

    
TheBlastOne 21.07.2011 14:58
quelle
0

Es gibt auch ein "DataSourceChanged" -Event ... vielleicht könnte das helfen

    
Scoregraphic 20.05.2009 13:20
quelle
0

Nur um zu klären, rufen Sie die Methode count () auf Nach dem Aufrufen der Methode databind ()

    
kumar 20.05.2009 13:29
quelle
0

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.

%Vor%     
quelle
0

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

    
Hans 22.05.2009 07:39
quelle
0

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";

    
dd 12.08.2009 14:54
quelle
0

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.

    
mono código 10.10.2016 22:35
quelle
0
%Vor%

NACH

%Vor%

Die DataSource-, DisplayMember- und ValueMember-Eigenschaft muss festgelegt werden, nachdem das Steuerelement seinem Container hinzugefügt wurde.

    
Taja_100 14.02.2017 07:06
quelle
-1

Ba Salam,

Sie können die Benutzeroberfläche einfach mit der Funktion preformLayout () aktualisieren;

Beispiel:

comboBox1.performLayout ();

Grüße mohsen s

    
Mohsen 01.07.2009 07:32
quelle
-1

Bitte versuchen Sie es:

%Vor%

Ich denke, deine Frage ist dieselbe wie heute.

    
Diddy 25.07.2009 13:29
quelle

Tags und Links