Laden...

ComboBox befüllen im Thread funktioniert nicht.

Erstellt von Tam0r vor 12 Jahren Letzter Beitrag vor 12 Jahren 1.503 Views
Thema geschlossen
T
Tam0r Themenstarter:in
137 Beiträge seit 2008
vor 12 Jahren
ComboBox befüllen im Thread funktioniert nicht.

Ich habe eine Form in der eine comboBox befüllt werden soll. Da ich viele einträge habe und die GUI nicht blockieren will, will ich das dies im Hintergrund abläuft.

Allerdings bleibt die ComboBox leer. Die daten werden nicht angezeigt. Führe ich allerdings den gleichen code in einer methode der Form aus funktioniert es. Genauso verhällt es sich wenn ich im backgroundWorker arbeite.

Hier mein Code:



SqlConnection connection = new SqlConnection(connectionString);
SqlDataAdapter adapter = new SqlDataAdapter();
DataTable table = new DataTable();

adapter = new SqlDataAdapter("SELECT Value FROM Test", connection);
adapter.Fill(table);



cmbTest.DisplayMember = "Value";
cmbTest.DataSource = table;


Kann sich einer vorstellen wieso dies nicht funktioniert ? Ich glaube das es einpaarmal funktioniert hat ? Konnte ich aber nicht wiederholen war irgendwie zufällig.

Kann es sein das es deswegen nicht funktioniert weil die Combobox nur im erzeugten Thread gebunden werden muss ?

Das komische ist ich bekomme keine exception oder so ? Der Ganze Code läuft im Thread druch...

T
Tam0r Themenstarter:in
137 Beiträge seit 2008
vor 12 Jahren

Das habe ich auch schon probiert. Allerdings wenn ich


cmbTest.DataSource = table;

über invoke aufrufe brauche ich keinen Thread mehr weil dieser Vorgang 3 sekunden dauert und somit die GUI für 3 sekunden einfriert. Gibt es denn keine möglichkeit die combobox aus einem anderen Thread zu befüllen ?

49.485 Beiträge seit 2005
vor 12 Jahren

Hallo Tam0r,

richtig ist: das Binden von Daten und der Zugriff auf gebundene Daten muss immer aus dem GUI-Thread erfolgen.

Allerdings ist auch deine Nachfrage in der FAQ beantwortet (genauer: die Antwort wird aus der FAQ heraus verlinkt), siehe Controls in anderem Thread erzeugen als das Form [==> auf keinen Fall]. (Siehe daher auch [Hinweis] Wie poste ich richtig? Punkt 1.1.

Wenn es also keinen Virtual Mode gibt (und auch der Ersatz der ComboBox durch ein Control, das einen Virtual Mode hat, nicht in Frage kommt) und DataBindung zu langsam ist, bleibt nichts anderes als häppchenweise zu füllen.

Normalerweise ist ein Benutzer mit einer Datenmenge, die so lange zum Füllen braucht, eh überfordert. Insofern sollte man überlegen, ob es nicht der bessere Weg ist, die Datenmenge zu reduzieren.

herbivore

T
Tam0r Themenstarter:in
137 Beiträge seit 2008
vor 12 Jahren

Erstmal vielen dank für die antworten.

Ich habe ein paar ansätze probiert und leider brachte keines den gewünschten erfolg. Nun habe ich eine Alternative Methode gefunden.

Anstatt einer combobox verwende ich nun eine textBox mit Autocomplete. Mit dieser Methode wird die Form sofort geladen und steht zur verfügung. Bei der eingabe von Buchstaben wird entsprechend gefiltert und gefundene lösungen angezeigt.

Ich habe es mit 20000 einträgen probiert und stellte kein Problem dar.

In C# – AutoComplete ComboBox o TextBox habe ich den Quellcode gefunden.

Thema geschlossen