Laden...

Viele Comboboxen mit einem Event abfangen?

Erstellt von metacircle vor 13 Jahren Letzter Beitrag vor 13 Jahren 1.648 Views
M
metacircle Themenstarter:in
24 Beiträge seit 2010
vor 13 Jahren
Viele Comboboxen mit einem Event abfangen?

Hallo,

wie aus meinem anderen Thread Grafische Objekte auf GUI verbinden: Ansatz gesucht bekannt habe ich eine Oberfläche entwickelt mit der man Logikbausteine verknüpfen kann.

Meine nächste Aufgabe ist es, eine Simulation der aufgebauten Logik zu realisieren. Dazu habe ich mir folgendes Fenster (siehe Anhang) entwickelt.

Eine Logik wie ich die Simulation realisiere schwirrt mit auch schon im Kopf rum, Problem an der Sache wäre aktuell folgendes: Sobald sich ein Eingang ändert, muss die Simulation neu angestoßen werden, dazu müsste ich mit meinem Fenster 48 Events abfangen, von jeder CheckBox einzeln, das finde ich sehr aufwändig und umständlich.

Kennt jemand eine einfachere Idee wie ich Änderungen an den Checkboxen eventuell global, in nur einem Event abfangen kann?

Grüße

C
2.121 Beiträge seit 2010
vor 13 Jahren

Indem du dem OnChanged immer die selbe Methode zuweist. Entweder im Designer, da stehen alle passenden Methoden in der Combobox beim Event, oder du machst das per Code. Dazu kannst du im Designercode nachschauen wie das genau aussieht.
In der Methode kannst du dann ahnand des "sender" entscheiden, welche Combobox das Event aufgerufen hat.

C
9 Beiträge seit 2008
vor 13 Jahren

Keine Ahnung ob das eleganter geht aber ich mach so etwas gerne auf diese
Art: (ungeprüftes Beispiel)



        private void Form1_Shown(object sender, EventArgs e)
        {            
            foreach (Control ctrl in groupBox1.Controls)
            { 
                if (ctrl is CheckBox)
                    ((CheckBox)ctrl).CheckedChanged += new EventHandler(checkBox_CheckedChanged);
            }
        }
                        
        private void checkBox_CheckedChanged(object sender, EventArgs e)
        {
            MessageBox.Show(((CheckBox)sender).Text);
        }

Gesegnet seien jene, die nichts zu sagen
haben und trotzdem den Mund halten (Oskar Wilde)

916 Beiträge seit 2008
vor 13 Jahren

Genau so würde ich es auch machen. Und beim Initialisieren wird ich die Tag Property der Checkbox nutzen um dir zu merken welche Checkbox es ist, sodass du in der Methode die dem Event zugeordnet ist weist welche Checkbox verändert wurde.

Again what learned...

3.511 Beiträge seit 2005
vor 13 Jahren

"Tag" brauchst du nicht zu setzen. Die CheckBox steht im sender des Events.

"Jedes Ding hat drei Seiten, eine positive, eine negative und eine komische." (Karl Valentin)

916 Beiträge seit 2008
vor 13 Jahren

Das ist schon klar, aber um zu wissen das dass die CheckBox 4 war sollte er das Tag Property verwenden oder von Ableiten und sich was eigenes zu basteln.

Again what learned...

C
2.121 Beiträge seit 2010
vor 13 Jahren

Kommt drauf an was er dann damit machen will.
Nur um irgendwas anzustoßen das dann sowieso alle Werte neu einliest, dazu braucht man gar keine weitere Info. Und wenns ein größeres if sein soll, dazu tuts dann ja der sender auch.
Vielleicht bekommen wir ja noch Info was es genau werden soll.

C
9 Beiträge seit 2008
vor 13 Jahren

Hab mal bissel rumgespielt...

Mit LINQ:


(from Control ctrl in groupBox1.Controls
where ctrl is CheckBox
select (CheckBox)ctrl)
.ToList().ForEach(c => c.CheckedChanged += new EventHandler(checkBox_CheckedChanged));

Gesegnet seien jene, die nichts zu sagen
haben und trotzdem den Mund halten (Oskar Wilde)

49.485 Beiträge seit 2005
vor 13 Jahren

Hallo creutzi73,

ich bin ja ein Fan von Linq, aber das geht noch schöner, kürzer und übersichtlicher:

foreach (CheckBox cbx in groupBox1.Controls.OfType <CheckBox> ()) {
   cbx.CheckedChanged += checkBox_CheckedChanged;
}

herbivore

C
9 Beiträge seit 2008
vor 13 Jahren

Cool. 8)
Sehe gerade, dass diese Erweiterungsmethode seit 3.5 besteht.

Dankö 👍

Gesegnet seien jene, die nichts zu sagen
haben und trotzdem den Mund halten (Oskar Wilde)