[C#] Überprüfung, welcher Button Ereignis ausgelöst hat

S_Drum

Mitglied
Hallo,

In meinem Programm lasse ich Buttons zur Laufzeit erstellen. Dies geschieht bei Klick auf einen anderen Button wie folgt:

Code:
fs = File.Open(fahrzeugliste, FileMode.Open, FileAccess.Read, FileShare.None);
using (StreamReader zeile = new StreamReader(fs, Encoding.Unicode))
{
  int multi = 1;
  datenzeile = zeile.ReadLine();
  while (datenzeile != null)
  {
    btn = new Button();                                 //Objekt der Klasse "Button" erstellen
    btn.Name = "btnFahrz" + datenzeile;                 //dem Objekt einen Namen zuweisen
    btn.Text = datenzeile;                              //dem Objekt eine Beschriftung zuweisen
    btn.BackColor = Color.Transparent;                  //Hintergrundfarbe des Objektes
    pnlFahrzNavi.Controls.Add(btn);                     //Objekt dem Elternelement zuweisen
    btn.Left = 6;                                       //linker Abstand zum Elternelement
    btn.Top = 50 * multi;                               //Abstand nach oben zum vorherigen Objekt
    btn.Width = 137;                                    //Länge des Buttons
    btn.Height = 23;                                    //Höhe des Buttons
    btn.Tag = datenzeile;                               //Zuweisung der Tag-Proberty
    EventHandler eh = new EventHandler(btnOnClick);     //Eventhandler-Objekt erstellen
    btn.Click += eh;                                    //dem Button den Eventhandler zuweisen
    multi++;                                            //Zählervariable inkrementieren
    datenzeile = zeile.ReadLine();                      //neue Datenzeile einlesen
  }
}

Momentan befinden sich 3 Einträge in der Datei "fahrzeugliste", also werden 3 Buttons erstellt. Das funktioniert auch wunderbar. Die 3 Buttons heißen nach der Erstellung:

-btnFahrzLF8/6
-btnFahrzTLF16/24
-btnFahrzMTF

Im Eventhandler "btnOnClick" will ich nun überprüfen, welcher (der momentan 3) Button das Ereignis ausgelöst hat. Eigentlich würde dies über die Abfrage:
Code:
public void btnOnClick(object sender, EventArgs e)
{
  if (sender==btnFahrzLF8/6)
  {
    label30.Text = "LF8";
  }
  else
  {
    label30.Text = "hat nicht geklappt";
  }
}

Das funktioniert aber nicht, weil der Compiler anmeckert: >>>Der Name "btnFahrzLF8/6" ist im aktuellen kontext nicht vorhanden.<<<


Was ist zu tun, damit ich überprüfen kann, welcher Button das Ereignis ausgelöst hat?

Danke.
 
Hi,

dein Ansatz ist schon richtig. Sender enthält das Objekt, welches das Event ausgelöst hat, in deinem Fall den Button.
Caste Sender nach Button und prüfe die Name-Eigenschaft. Siehe Codebeispiel.

C#:
public void btnOnClick(object sender, EventArgs e)
{
  Button btn = (Button)sender;
  if (btn.Name == "btnFahrzLF8/6")
  {
    label30.Text = "LF8";
  }
  else
  {
    label30.Text = "hat nicht geklappt";
  }
}

Wenn du weitere Fragen hast, bitte frag!
 
Danke für deine schnelle Antwort, FwDonnerbalken.

Grad eben fiel mir die Lösung wie Schuppen von den Augen. Mein Problem lag darin, dass ich mit jedem Schleifendurchlauf ein und dasselbe Objekt erstellt habe, nämlich immer:

Button btn = new Button();

Jetzt erstelle ich beim Start der Anwendung ein Array mit vielen Objekten der Klasse "Button":

Button[] btn = new Button[3]; (zum Testen hab ich mal 3 Objekte erstellt)

In jedem Schleifendurchlauf greife ich nun nicht mehr auf ein und dasselbe Objekt zu, sondern immer auf ein anderes:

Code:
fs = File.Open(fahrzeugliste, FileMode.Open, FileAccess.Read, FileShare.None);
using (StreamReader zeile = new StreamReader(fs, Encoding.Unicode))
{
  int multi = 0;
  datenzeile = zeile.ReadLine();
  while (datenzeile != null)
  {
    btn[multi] = new Button();
    btn[multi].Name = "btnFahrz" + datenzeile;                 
    btn[multi].Text = datenzeile;                              
    btn[multi].BackColor = Color.Transparent;                  
    pnlFahrzNavi.Controls.Add(btn[multi]);                     
    btn[multi].Left = 6;                                      
    btn[multi].Top = 50 * (multi + 1);                          
    btn[multi].Width = 137;                                 
    btn[multi].Height = 23;                                   
    btn[multi].Tag = datenzeile;                        
    EventHandler eh = new EventHandler(btnOnClick);     
    btn[multi].Click += eh;                            
    multi++;                                            
    datenzeile = zeile.ReadLine();                      
  }
}

Die Variable "multi" fungiert hierbei als Zähler.

Jetzt kann ich auch im Ereignishandler folgendermaßen abfragen:

Code:
public void btnOnClick(object sender, EventArgs e)
{
  if (sender == btn[0])
  {
    label30.Text = "LF8";
  }
  else if (sender == btn[1])
  {
    label30.Text = "TLF 16724";
  }
  else
  {
    label30.Text = "MTF";
  }
}


Das funktioniert jetzt auch wunderbar. Das hätte mir aber auch mal ne Stunde eher auffallen können. ;-))
 
Oder so, ok! Aber das Array brauchst du nicht unbedingt. Die Controls-Collection von deinem Panel beinhaltet ja ebenfalls alle Buttons, diese könntest du prinzipiell auch abfragen.

Grundsätzlich stellt sich natürlich die Frage, wie flexibel der Eventhandler von deinem Button einmal werden soll. Zur Zeit codierst du hart jedes mögliche Fahrzeug, kommt ein neues hinzu, dann musst du dein Programm ändern.
Denkbar wäre zum Beispiel die Labeltexte aus einer Datenbank oder XML-Datei nachzulesen. Als Schlüssel dafür kannst du entweder den Wert der Namen-Eigenschaft nehmen oder was ich persönlich in diesem Falls besser finde, die Tag-Eigenschaft des Button.
 
So, ich hab den Eventhandler an die Dynamik angepasst.

Code:
public void btnOnClick(object sender, EventArgs e)
{          
  pnlFahrzData.Visible = true;

  for (i = 0; i < nNumberOfDataRows; i++)
  {
    if (sender == btn[i])
    {
      lblFahrzÜberschrift.Text = btn[i].Tag.ToString();
      ....
      ....
    }
  }
}

nNumberOfDataRows ist der Rückgabewert einer Methode, die die Anzahl der Datenreihen (und somit die Anzahl der gespeicherten Fahrzeuge) ermittelt.

Es funktioniert momentan ohne Probleme.

Gruss Silvio
 
Zuletzt bearbeitet:
Zurück