Autor Beitrag
skysurfer102
Hält's aus hier
Beiträge: 4



BeitragVerfasst: So 14.02.16 17:15 
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:

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: 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

ausblenden 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 Threadstarter
Hält's aus hier
Beiträge: 4



BeitragVerfasst: So 14.02.16 18:30 
Danke für deine Tips. Werde ich morgen direkt testen.

Gruss
Skysurfer102
skysurfer102 Threadstarter
Hält's aus hier
Beiträge: 4



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: 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

ausblenden 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 
    }
}

Für diesen Beitrag haben gedankt: skysurfer102
skysurfer102 Threadstarter
Hält's aus hier
Beiträge: 4



BeitragVerfasst: Mi 17.02.16 20:41 
Danke

klappt wunderbar !!!