performantes Kopieren von Combobox in List
-
Nur mal nebenbei, wenn du direkt mit Databinding arbeiten würdest, bräuchtest du die Liste nicht händisch durchgehen.
Sieh dir zum Beispiel mal die BindingList<T> an.
Ein Beispiel:
public class myForm : Form { private BindingList<String> _myList = new BindingList<String>(); public myForm() { myList.RaiseListChangedEvent = true; myComboBox.DataSource = _myList; } }
Auf diese Weise hättest du immer die Werte der ComboBox in einer Liste.
-
Die Frage ist ja beantwortet, aber auf OfType() als Extension-Methode des nicht-generischen IEnumerable kann man nicht oft genug hinweisen. Damit ist man direkt in der Welt von LINQ und der Code wird elegant
List<string> KartenList = cbox_KartenNummern.Items.OfType<string>().ToList();
inflames2k schrieb:
Auf diese Weise hättest du immer die Werte der ComboBox in einer Liste.
Die BindingList ist großartig, imho der nützlichste Binding-Mechanismus in Winforms. Leider fliegt kein Event beim Löschen eines Eintrags. Aber man kann die Klasse einfach dementsprechend erweitern
Dann steht einem Commit- & Rollback-Mechanismus in ein paar Zeilen Code nichts mehr im Wege
-
Danke erst mal, es funktioniert jetzt mit dem forech top und auch viel schneller als zuvor, ausgebremst hat das selectedIndex und das dmit verbundene redraw...
Zum Beitrag list / bindinglist...
wenn ich aus einer Textdatei 1000 Werte direkt in eine Combobox einlese dauert das ein Augenzwinkern und die Box ist mit Werten gefüllt. Wenn ich die Box an eine Datasource List knüpfe und die Liste befülle geht viel an Performance in den Untiefen der Softwareschichten verloren...der Komfort des Bitknechtes steigt natürlich.
Grüße Opal
-
Opal19 schrieb:
Wenn ich die Box an eine Datasource List knüpfe und die Liste befülle geht viel an Performance in den Untiefen der Softwareschichten verloren.
Andersrum: Liste füllen, dann Binden.
Und: Wahrscheinlich hast Du wieder Events Die bei jedem der 1000 Einträge aufgerufen werden.Mit 1000 Einträgen zwingt man kein Control in die Knie.
-
> Andersrum: Liste füllen, dann Binden.
> Und: Wahrscheinlich hast Du wieder Events Die bei jedem der 1000
> Einträge >aufgerufen werden.Hallo µ,
wenn ich es so ausführe wie Du vorschlägst, bekommt die Combobox nicht mit, und deren Inhalt bleibt leer.
Also Liste erst füllen und dann der Combobox die Datasource zuweisen bewirkt gar nix, sie bleibt einfach leer.
Auch wenn ich die Events der BindingList abschalte, dann fülle, bleibt die Combobox leer. Events müssen demnach an sein und kosten viel Zeit...
Bist Du Dir mit Deinen Aussagen sicher?
-
Klar geht das.
BindingList<string> list = new BindingList<string>(); list.Add("herp"); list.Add("derp"); comboBox1.DataSource = list;
Wie machst Du es denn?
-
Ja, Du liegst richtig, die Eigenschaft "sorted" darf dazu aber nicht auf "true" stehen, das stand die bei mir, da die Inhalten der combobox sortiert sein müssen. Ein Problem gelöst, ein Neues aufgetan
Grüße Opal
-
Hmm, geht doch auch sortiert...
public partial class Form1 : Form { BindingList<string> list; public Form1() { InitializeComponent(); list = new BindingList<string>(); list.Add("d"); list.Add("b"); list.Add("a"); comboBox1.Sorted = true; comboBox1.DataSource = list; } private void button1_Click(object sender, EventArgs e) { list.Add("c"); } }
-
komisch...
habe Deinen Code getstet, funktioniert i.o.
meiner leider noch nicht, den einzigen Unterschied den ich noch sehe, das ich von einem Child Window aus im Parent die Combobox manipuliere.
Grüße opal
-
Achte auf die Reihenfolge.
Wenn Du folgende Zeilen vertauscht, knallts:comboBox1.Sorted = true;
comboBox1.DataSource = list;