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)
            {
                // ist es eine ComboBox?
                if (c[0is ComboBox)
                {
                    // dann kann auf ihre Items zugegriffen werden
                    (c[0as 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 user profile iconChristian 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;
    }
}

//Aufruf
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:
// irgendwo Klassenvariable definiert
var combos = new List<ComboBox>();

// irgendwo Controls erstellt
for (whatever condition)
{
    var cb = new ComboBox();
    // ComboBox sinvoll initialisieren
    // ....

    //Handler zuweisen
    cb.SelectedIndexChanged += MyLovelySelectedIndexChanged;

    combos.Add(cb);
    this.Controls.Add(cb); 
}

// irgendwo EventHandler Methode definiert
private void MyLovelySelectedIndexChanged(object sender, EventArgs e)
{
    var cb = sender as ComboBox;
    if (cb != null)
    {
        //do something 
    }
}


skysurfer102 - Mi 17.02.16 20:41

Danke

klappt wunderbar !!!