Autor Beitrag
vreden123
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 95
Erhaltene Danke: 2



BeitragVerfasst: Mo 23.05.11 23:36 
Hallo,

ich habe folgenden Code:

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19312
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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:
ausblenden 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.)

Für diesen Beitrag haben gedankt: vreden123
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4795
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Di 24.05.11 11:37 
Hallo zusammen,

als Alternative zum Dictionary kann auch für Controls die Tag-Eigenschaft benutzt werden:
ausblenden 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)
{
  ...
}

Für diesen Beitrag haben gedankt: vreden123
vreden123 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 95
Erhaltene Danke: 2



BeitragVerfasst: Do 23.06.11 19:25 
Also so ganz läuft das noch nicht.

Dieser Code wird 5 mal ausgeführt.
ausblenden 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
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4795
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: 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:
ausblenden 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.

Für diesen Beitrag haben gedankt: vreden123
Chiyoko
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 298
Erhaltene Danke: 8

Win 98, Win Xp, Win 10
C# / C (VS 2019)
BeitragVerfasst: 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.

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

Für diesen Beitrag haben gedankt: vreden123
vreden123 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 95
Erhaltene Danke: 2



BeitragVerfasst: Do 23.06.11 20:00 
Ah,
jetzt habe ich es verstanden!
Danke nochmal für die tolle Hilfe!
vreden123 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 95
Erhaltene Danke: 2



BeitragVerfasst: Do 23.06.11 20:30 
Habe jetzt alles soweit am laufen, aber eine Frage habe ich noch.

Mit:

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

Ubuntu 13.04, Win 7
C# (VS 2013)
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 95
Erhaltene Danke: 2



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19312
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mo 27.06.11 09:07 
user profile iconTh69 hat folgendes geschrieben Zum zitierten Posting springen:
ausblenden 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:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
       // do something with this button
       if (button.Name is string)
       {
         string ButtonName = (string)button.Name;
       }
vreden123 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 95
Erhaltene Danke: 2



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4795
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: 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:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 222
Erhaltene Danke: 16

Win XP, Win 7 64-Bit
C# 4.0 (VS2010)
BeitragVerfasst: Mo 27.06.11 09:55 
"if (button.Name is string)"

schön :)
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19312
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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. ;-)