Laden...

Ereignisbehandlung zu einem Array aus Objeken

Erstellt von ichwars vor 11 Jahren Letzter Beitrag vor 11 Jahren 1.300 Views
Thema geschlossen
I
ichwars Themenstarter:in
3 Beiträge seit 2012
vor 11 Jahren
Ereignisbehandlung zu einem Array aus Objeken

Hallo liebe Forumgemeinde,

ich habe ein Array aus Comboboxen erstellt. Jetzt möchte ich natürlich auch das Ereignis SelectedIndexChanged zu jedem Element der im Array enthaltenen Comboboxen auswerten.
Wie genau funktioniert das? Brauche ich jetzt auch ein Array aus Ereignisbehandlungsmethoden (hab ich probiert)?
Oder ist es möglich, eine Methode zu erstellen, bei der dann nur der Index übergeben wird?
Bei Änderung einer der Comboboxen im Array Kurve_Extruder[] wird in die Ereignisbehandlungsmethode "Kurve_Extruder_SelectedIndexChanged(object sender, EventArgs e)" s.u. gesprungen, doch woher weiß ich jetzt, welches Array-Element das Ereignis ausgelöst hat?
Die eine Zeile in der Methode erzeugt übrigens eine NullReferenceException...

Hier mal der Code...


 public Form1()
        {
            InitializeComponent();
            ComboBox[] Kurve_Extruder = new ComboBox[8];
            ComboBox[] Kurve_Parameter = new ComboBox[8];
            ComboBox[] Kurve_Soll_Ist = new ComboBox[8];
            ComboBox[] Kurve_Element = new ComboBox[8];

           
            for (int i = 0; i < 8; i++)
            {
                Kurve_Extruder[i] = new ComboBox();    
                Kurve_Parameter[i] = new ComboBox();
                Kurve_Soll_Ist[i] = new ComboBox();
                Kurve_Element[i] = new ComboBox();
                Kurve_Extruder[i].Location = new Point(85, 244 + i * 28);
                Kurve_Parameter[i].Location = new Point(222, 244 + i * 28);
                Kurve_Soll_Ist[i].Location = new Point(367, 244 + i * 28);
                Kurve_Element[i].Location = new Point(504, 244 + i * 28);
                Controls.Add(Kurve_Extruder[i]);
                Controls.Add(Kurve_Parameter[i]);
                Controls.Add(Kurve_Soll_Ist[i]);
                Controls.Add(Kurve_Element[i]);
                string[] Liste = new string[] {"Bitte wählen...", "Extruder K90", "Extruder K70", "Extruder K35", "Glättwalzen", "Ereignisse", "Dosierung"};
                Kurve_Extruder[i].Items.AddRange(Liste);
                Kurve_Extruder[i].Text = "Bitte wählen...";

                Kurve_Extruder[i].SelectedIndexChanged += new System.EventHandler(Kurve_Extruder_SelectedIndexChanged);
            }
        }

        private void Kurve_Extruder_SelectedIndexChanged(object sender, EventArgs e)
        {
            label1.Text = Kurve_Extruder.SelectedItem.ToString();
        }

Vielen Dank im Voraus!
Gruß Heiko

3.430 Beiträge seit 2007
vor 11 Jahren

Hallo ichwars,

bei den Event-Handler kriegst du meistens einen Sender mit.
D.h. das ist das Objekt welches das Event ausgelöst hat.

In deinem Fall ist der Sender die ComboBox welche das Event ausgelöst hat.
Du kannst somit das Event all deiner ComboBoxen auf die eine Methode registrieren und kriegst über den Sender raus bei wen sich was geändert hat.

Grüße
Michael

I
ichwars Themenstarter:in
3 Beiträge seit 2012
vor 11 Jahren

Hallo Michael,

danke für die schnelle Antwort. Hast du vielleicht ein Bsp. oder einen Link dazu?

Gruß Heiko

3.430 Beiträge seit 2007
vor 11 Jahren

Hallo,

der Sender ist ein Object.
Deshalb musst du es erst noch auf ComboBox casten um darauf zugreifen zu können.
Also so


var cmb = (ComboBox)sender;
//jetzt kannst du die ComboBox verwenden

PS: Bitte beachte [Hinweis] Wie poste ich richtig? 1.1 und 1.1.1
Ein bisschen googlen und Grundwissen wie man Typen castet setzen wir hier voraus. Vielen Dank!

Grüße
Michael

I
ichwars Themenstarter:in
3 Beiträge seit 2012
vor 11 Jahren

Hallo Michael,

ich wußte nicht, dass ich den Sender erst auf die Combobox casten muß... zumal er ja von der Combobox selbst aufgerufen wird. Aber wenn der Sender selbst ein Objekt für sich ist, ist das klar.

Besten Dank!
Gruß Heiko

49.485 Beiträge seit 2005
vor 11 Jahren

Hallo ichwars,

sender ist kein "Objekt für sich", sondern lediglich ein Parameter, also die Variable, die bei der Parameterübergabe auf das Objekt verweist. Und dieses Objekt ist die ComboBox, die das Event ausgelöst hat. Nichts anderes und schon gar kein anderes Objekt. Da der Parameter jedoch vom allgemeinsten verfügbaren Typ - nämlich Object - ist, muss man erst casten, um darüber auf die Member der ComboBox zugreifen zu können. Das Casten ändert an dem Typ des Objekts und an dem Objekt selbst überhaupt nichts, sondern nur daran, welche Zugriffe auf die Member des Objekts möglich sind.

Den Typ der Variable nennt man den statische Typ und den Typ des Objekts, auf das die Variable verweist, nennt man dynamischen Typ. Trenne gedanklich immer klar zwischen Objekten und den Variablen, die auf die Objekte verweisen.

Aber das sind wirklich Grundlagen. Bitte beachte [Hinweis] Wie poste ich richtig? Punkt 1.1.1.

Ein bisschen [...] Grundwissen wie man Typen castet setzen wir hier voraus.

Oder alternativ zumindest den Willen, das Grundwissen bei Bedarf nachzuschlagen, z.B. in der FAQ [Tipp] Casten aber richtig: () / is / as. Beachte daher auch Punkt 1.1.

herbivore

Thema geschlossen