Entwickler-Ecke
WinForms - mehrere comboBoxen zur Laufzeit mit gleichen Werten füllen
skysurfer102 - So 14.02.16 17:15
Titel: mehrere comboBoxen zur Laufzeit mit gleichen Werten füllen
Hallo Zusammen
ich bin neu hier im Forum und hoffe ich stelle meinen Bericht ins richtige Forum.
Ich muss für ein Projekt abhängig von einer Linienkonfikuration unterschiedlich viele comboBoxen mit den gleichen Werten befüllen.
Mein Code zum befüllen sieht folgendermaßen aus:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| Control[] c = this.Controls.Find("comboBox", true);
if (c.Length > 0) { if (c[0] is ComboBox) { (c[0] as ComboBox).Items.Add("Test"); } } |
Mein Problem: die Methode this.Controls.Find("comboBox", true)findet nur die einen ComboBox die genauso heisst. Ich lege allerdings zur Laufzeit die ComboBoxen mit einer laufenden Nummer an.
Gibt es da eine einfache Abhilfe damit ich alle ComboBoxen mit Namen comboBox* finde oder muss ich meine Methode zum erstellen der ComboBoxen zur Laufzeit ändern ??
Vielen Dank für eure Hilfe.
Gruss
Skysurfer102
Moderiert von
Christian S.: C#-Tags hinzugefügt
Ralf Jansen - So 14.02.16 18:05
Zitat: |
Gibt es da eine einfache Abhilfe oder muss ich meine Methode zum erstellen der ComboBoxen zur Laufzeit ändern ?? |
Wenn du die Comboboxen zur Laufzeit erstellst spricht nichts dagegen sie einfach zusätzlich in eine Liste zu schreiben (z.B eine List<ComboBox>) um später damit zu arbeiten. Jetzt wirfst du die erst mit allen anderen Controls der Form zusammen um sie dann wieder über den Namen rauszupulen. Da du sie aber schon an der Hand hattest ist der Aufwand völlig unnötig. Best Practice wäre eh nie von dem Namen eines Controls abhängig zu sein. Weder muss ein Control einen Namen haben noch muss der eindeutig sein. Noch hat man, je nach Project, Einfluß darauf wie genau alle Controls der Form heißen.
Alternative wäre alle Comboboxen auf ein Container Control(Panel, GroupBox, Tab etc.) zu parenten und nicht direkt auf die Form zu packen. Dann weißt du genau alle Controls dieses Parent sind meine Comboboxen die mich interessieren. Alternative Alternative ;) wäre eine passende Find Implementierung zu schreiben die mit einem partiellen Namen umgehen kann. Z.B. folgende Extension Method
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
| public static class ControlHelper { public static IEnumerable<Control> FindByStartsWithName(this Control control, string name, StringComparison comparisonType = StringComparison.InvariantCultureIgnoreCase, bool searchAllChildren = false) { if (searchAllChildren) foreach (Control child in control.Controls) foreach (var subchild in FindByStartsWithName(child, name, comparisonType, searchAllChildren)) yield return subchild;
if (!string.IsNullOrWhiteSpace(name) && control.Name.StartsWith(name, comparisonType)) yield return control; } }
var comboboxes = this.FindByStartsWithName("comboBox", searchAllChildren: true).OfType<ComboBox>().ToArray(); |
Wenn du in alle Comboxen die gleichen Werte schreibst wäre es einfacher ebenfalls alle diese Werte in eine Liste zu schreiben und diese Liste einfach der ComboBox.DataSource Property zuzuweisen.
skysurfer102 - So 14.02.16 18:30
Danke für deine Tips. Werde ich morgen direkt testen.
Gruss
Skysurfer102
skysurfer102 - Mi 17.02.16 19:27
Nochmals vielen vielen Dank.
Habe die Variante mit der Liste gewählt. Funktioniert super.
Nun komme ich zum nächsten Problem.
Die zur Laufzeit erzeugten Objekte benötigen nun Events. Im speziellen das Event SelectedIndexChanged meiner ComboBoxen.
Wie bekommt man sowas denn hin ?
Bin noch relativ neu in C# oder Objektorientierung.
Gruss
Skysurfer102
Ralf Jansen - Mi 17.02.16 20:11
Zitat: |
Die zur Laufzeit erzeugten Objekte benötigen nun Events. Im speziellen das Event SelectedIndexChanged meiner ComboBoxen. |
Beim erzeugen der Comboboxen einfach den Event zuweisen?
Also irgendwie machst du ja vermutlich irgendwie sowas
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26:
| var combos = new List<ComboBox>();
for (whatever condition) { var cb = new ComboBox(); cb.SelectedIndexChanged += MyLovelySelectedIndexChanged;
combos.Add(cb); this.Controls.Add(cb); }
private void MyLovelySelectedIndexChanged(object sender, EventArgs e) { var cb = sender as ComboBox; if (cb != null) { } } |
skysurfer102 - Mi 17.02.16 20:41
Danke
klappt wunderbar !!!
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!