Autor |
Beitrag |
vreden123
      
Beiträge: 95
Erhaltene Danke: 2
|
Verfasst: Mo 23.05.11 23:36
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(6, 20); seitehinzufügen_txt_titel.Size = new Size(40, 20); 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
      
Beiträge: 19312
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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<object, string> MessageTexts = new Dictionary<object, string>(); MessageTexts.Add(seitehinzufügen_txt_titel, "lol"); ...
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
      

Beiträge: 4795
Erhaltene Danke: 1059
Win10
C#, C++ (VS 2017/19/22)
|
Verfasst: 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;
ValueType value = (ValueType)button.Tag; ReferenceType value = button.Tag as ReferenceType; if (value != null) { ... } |
Für diesen Beitrag haben gedankt: vreden123
|
|
vreden123 
      
Beiträge: 95
Erhaltene Danke: 2
|
Verfasst: 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(6, 20); seitehinzufügen_txt_titel.Size = new Size(40, 20); 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
      

Beiträge: 4795
Erhaltene Danke: 1059
Win10
C#, C++ (VS 2017/19/22)
|
Verfasst: 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) { 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
      
Beiträge: 298
Erhaltene Danke: 8
Win 98, Win Xp, Win 10
C# / C (VS 2019)
|
Verfasst: 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:
| private void seitenHinzufuegenClick(object sender, EventArgs e) { if(sender == buttonX) MessageBox.Show("");
} |
Für diesen Beitrag haben gedankt: vreden123
|
|
vreden123 
      
Beiträge: 95
Erhaltene Danke: 2
|
Verfasst: Do 23.06.11 20:00
Ah,
jetzt habe ich es verstanden!
Danke nochmal für die tolle Hilfe!
|
|
vreden123 
      
Beiträge: 95
Erhaltene Danke: 2
|
Verfasst: 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
      
Beiträge: 2598
Erhaltene Danke: 156
Ubuntu 13.04, Win 7
C# (VS 2013)
|
Verfasst: 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 
      
Beiträge: 95
Erhaltene Danke: 2
|
Verfasst: 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
      
Beiträge: 19312
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mo 27.06.11 09:07
|
|
vreden123 
      
Beiträge: 95
Erhaltene Danke: 2
|
Verfasst: 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
      

Beiträge: 4795
Erhaltene Danke: 1059
Win10
C#, C++ (VS 2017/19/22)
|
Verfasst: Mo 27.06.11 09:51
Hallo jaenicke,
jaenicke hat folgendes geschrieben: | if (button.Name is string) |
Der ist gut
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
      
Beiträge: 222
Erhaltene Danke: 16
Win XP, Win 7 64-Bit
C# 4.0 (VS2010)
|
Verfasst: Mo 27.06.11 09:55
"if (button.Name is string)"
schön 
|
|
jaenicke
      
Beiträge: 19312
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mo 27.06.11 10:23
|
|