Entwickler-Ecke

WinForms - Click Event mit Parameterübergabe


vreden123 - Mo 23.05.11 23:36
Titel: Click Event mit Parameterübergabe
Hallo,

ich habe folgenden Code:


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
            Button seitehinzufügen_txt_titel = new Button();
            seitehinzufügen_txt_titel.Text = "s_titel";
            seitehinzufügen_txt_titel.Location = new Point(620);
            seitehinzufügen_txt_titel.Size = new Size(4020);
            seitehinzufügen_txt_titel.Name = "seitehinzufügen_txt_titel";
            seitehinzufügen_txt_titel.Visible = true;
            seitehinzufügen_txt_titel.Click += new EventHandler(seitehinzufügen_txt_titel_Click("lol");
            this.Controls.Add(seitehinzufügen_txt_titel);


Ich möchte bei dem .Click Event einen Wert mit übergeben.
Dies mache ich aus folgendem Grund.
Ich erstelle mehrere Buttons und bei jedem Button soll eine MessageBox mit einem Wert ausgeben werden.

Ich habe mir jetzt gedacht, dass ich einfach bei dem .Click event ein Wert übergebe, nur ich weiß nicht wie ich das anstellen soll oder ob das so möglich ist wie ich mir das vorstelle.
Weil im moment bekomme ich noch eine Fehlermeldung, dass das Argument nicht angenommen wird.


jaenicke - Di 24.05.11 04:42

Das geht so auch nicht. Du kannst dir die Werte aber einfach in einem Dictionary speichern und daraus im Click-Ereignis wieder abrufen:

C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
    Dictionary<objectstring> MessageTexts = new Dictionary<objectstring>();
    MessageTexts.Add(seitehinzufügen_txt_titel, "lol");
    ...

    // das selbe Click-Ereignis für alle diese Buttons:
    if (MessageTexts.ContainsKey(sender))
        MessageBox.Show(MessageTexts[sender]);
Weshalb hältst du dich eigentlich nicht an die Richtlinien zur Benennung (keine Unterstriche, zur Trennung Großbuchstaben, ...)? Der Quelltext ist so nicht gerade einfach zu lesen...
(Davon abgesehen, dass deutsche Bezeichner ohnehin ungewöhnlich sind.)


Th69 - Di 24.05.11 11:37

Hallo zusammen,

als Alternative zum Dictionary kann auch für Controls die Tag-Eigenschaft benutzt werden:

C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
button.Tag = someObject;

// in button event
ValueType value = (ValueType)button.Tag; // für Wertetypen, z.B. int, bool, float, struct etc.
// oder alternativ
ReferenceType value = button.Tag as ReferenceType; // für Referenztypen (class)
if (value != null)
{
  ...
}


vreden123 - Do 23.06.11 19:25

Also so ganz läuft das noch nicht.

Dieser Code wird 5 mal ausgeführt.

C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
            Button seitehinzufügen_txt_titel = new Button();
            seitehinzufügen_txt_titel.Text = "s_titel";
            seitehinzufügen_txt_titel.Location = new Point(620);
            seitehinzufügen_txt_titel.Size = new Size(4020);
            seitehinzufügen_txt_titel.Name = "seitehinzufügen_txt_titel";
            seitehinzufügen_txt_titel.Visible = true;
            seitehinzufügen_txt_titel.Click += new EventHandler(seitehinzufügen_txt_titel_Click("lol");
            this.Controls.Add(seitehinzufügen_txt_titel);


Es werden jetzt 5 Buttons erstellt.
Mein Problem ist jetzt das alle 5 Buttons das selbe .Click Ereignis haben und ich muss ermitteln welcher Button angeklickt wurde.

Ich wollte das ja erst mit

C#-Quelltext
1:
seitehinzufügen_txt_titel.Click += new EventHandler(seitehinzufügen_txt_titel_Click("lol");                    


versuchen aber das geht ja nicht.
Ich muss irgendwie beim klicken auf einem Button einen Wert übergeben, dass ich dann ermitteln kann welcher Button letztendlich angeklickt wurde.
Die vorgeschlagen Lösungsmethoden klappen irgendwie nicht.


Th69 - Do 23.06.11 19:33

Hallo vreden123,

das Objekt selber wird im Parameter 'sender' der Eventmethode übergeben - man muß es dann nur noch entsprechend casten:

C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
void seitehinzufügen_txt_titel_Click(object sender, EventArgs e)
{
    Button button = sender as Button;
    if (button != null)
    {
       // do something with this button e.g.
       if (button.Tag is int)
       {
         int tag = (int)button.Tag;
       }
    }
}

Dies sollte aber eigentlich in jedem Grundlagenbuch über die WinForms-Programmierung stehen.


Chiyoko - Do 23.06.11 19:43

Ich mag die Tag funktion nicht und finde, dass es so einfacher gehen würde und er es vielleicht auch besser versteht.


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
// In die Event funktion:

private void seitenHinzufuegenClick(object sender, EventArgs e)
{
    if(sender == buttonX)
        MessageBox.Show("");

// usw...
}


vreden123 - Do 23.06.11 20:00

Ah,
jetzt habe ich es verstanden!
Danke nochmal für die tolle Hilfe!


vreden123 - Do 23.06.11 20:30

Habe jetzt alles soweit am laufen, aber eine Frage habe ich noch.

Mit:


C#-Quelltext
1:
2:
3:
4:
5:
        private void seitenBearbeitenClick(object sender, EventArgs e)
        {
            
            MessageBox.Show(Convert.ToString(sender));
        }


Kann ich den Text auslesen, den die Textbox hat.
Gibt es auch noch eine möglichkeit den Namen der Textbox auszulesen?
Weil der ändert sich mit jeder neu erstellten Textbox.


Yogu - Do 23.06.11 20:55

Du hast doch schon selbst die Name-Eigenschaft benutzt - da steht der Name drin. Auf die Eigenschaft kannst du genau so zugreifen wie auf Tag.


vreden123 - Mo 27.06.11 08:46

Aber wie kann ich auf die .Name Eigenschaft zugreifen?

Weil über den "Sender" bzw "e" komme ich nicht auf die Nameneigenschaft, der Textbox.
Bestimmt sehe ich den Wald vor lauter Bäumen nicht.


jaenicke - Mo 27.06.11 09:07

user profile iconTh69 hat folgendes geschrieben Zum zitierten Posting springen:

C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
void seitehinzufügen_txt_titel_Click(object sender, EventArgs e)
{
    Button button = sender as Button;
    if (button != null)
    {
       // do something with this button e.g.
       if (button.Tag is int)
       {
         int tag = (int)button.Tag;
       }
    }
}
Ist es wirklich so schwer jetzt auf Name statt auf Tag zuzugreifen? :gruebel:

C#-Quelltext
1:
2:
3:
4:
5:
       // do something with this button
       if (button.Name is string)
       {
         string ButtonName = (string)button.Name;
       }


vreden123 - Mo 27.06.11 09:29

Ne eigentlich nicht :-)
ich hatte nur die andere Methode verwendet und konnte mir nicht vorstellen, dass ich so über den Sender darauf zugreifen kann.


Th69 - Mo 27.06.11 09:51

Hallo jaenicke,

jaenicke hat folgendes geschrieben:
if (button.Name is string)

Der ist gut :D

Hier reicht natürlich:

C#-Quelltext
1:
string ButtonName = button.Name;                    

denn Name ist ja schon ein 'string' (die Tag-Eigenschaft ist dagegen als 'object' definiert, so daß man beliebige Daten hinterlegen kann und entsprechend beim Zugriff darauf casten muß).


norman2306 - Mo 27.06.11 09:55

"if (button.Name is string)"

schön :)


jaenicke - Mo 27.06.11 10:23

user profile iconTh69 hat folgendes geschrieben Zum zitierten Posting springen:
jaenicke hat folgendes geschrieben:
if (button.Name is string)

Der ist gut :D
Ich wollte zeigen, dass er den ursprünglichen Quelltext im Grunde 1:1 übernehmen hätte können. Ob es nötig ist, war mir dabei egal, denn funktionieren tut es ja. ;-)