Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

23.07.2011, 15:07

C# EventHandler mehr Parameter

Hey Leute.

Ich habe ein Problem bezüglich EventHandler und zwar:

Ich habe eine Methode: private void macheWas(object sender, EventArgs e, string s){...}

und möchte, dass diese bei einem Buttonklick ausgeführt wird

button.Click += new EventHandler(...) , aber wie genau mache ich das? Ich meine, so wie ich das verstanden habe ist EventHandler ja ein Delegate und erwartet ja nur zwei Parameter (object und EventArgs), wie mache ich das aber, wenn ich nun aber mehrere Parameter haben möchte?

(Bin noch relativ neu was C# angeht :D )

Danke im voraus.

Sylence

Community-Fossil

Beiträge: 1 663

Beruf: Softwareentwickler

  • Private Nachricht senden

2

23.07.2011, 15:13

Richtig. Für das Click event brauchst du eine Funktion mit 2 parametern. Du kannst deine Funktion mit drei Parametern also nicht ohne weiteres dafür benutzen.
Woher sollte der Button auch wissen, was er in den dritten parameter schreiben soll?

Wenn du die Funktion unbedingt nach einem Button click aufrufen willst, dann kannst du das im normalen event handler des clicks machen

C#-Quelltext

1
2
3
4
void MyButton_Click( object sender, EventArgs e )
{
   macheWas( sender, e, "WasAuchImmer" );
}

3

23.07.2011, 15:59

Danke erstmal für die schnelle Antwort :).

Das der Button das nicht weiß ist ja irgendwo klar.

C#-Quelltext

1
2
3
4
5
6
7
8
void test1()
{
    TextBox a = new TextBox();
    TextBox b = new textBox();
    ...
    
    button1.Click += ...
}


Mal angenommen ich habe die oben gesehene Methode.

Nun schreibe ich noch eine Methode, die mit dem inhalt der
Textboxen arbeitet. Und diese Methode soll nach dem Buttonklick
aufgerufen werden. Da aber die Textboxen lokale Variablen sind,
kann ich ja nicht einfach von einer andere Methode aus zugreifen,
und extra eine Variable, die für alle Methoden gültig ist, möchte ich nicht.
Das heißt ja, ich bräuchte eine Methode, die zum einen, wegen dem EventHandler
ein object und ein EventArgs Objekt benötigt, sowie einen string. (bzw. mehrere für die ganzen Textboxen).

C#-Quelltext

1
void test2(object sender, EventArgs e, string s)


das das nicht geht ist ja soweit klar.

C#-Quelltext

1
2
3
4
void MyButton_Click( object sender, EventArgs e )
{
   macheWas( sender, e, "WasAuchImmer" );
}


Wenn ich das so machen würde, müsste ich ja zu diesem Zeitpunkt schon
wissen, was ich für den string Parameter verwenden möchte.

Oder denke ich gerade komplett verkehrt? :D

Ich habe also eine Methode, die Textboxen mit Inhalten hat und eine weitere Methode, die mit diesen Inhalten arbeiten soll.
Und die Methode, die mit den Inhalten der TextBoxen arbeiten soll, soll nach einem Buttonklick aufgerufen werden...
Wahrscheinlich ist die Lösung ziemlich einfach, nur ich komm einfach nicht drauf :P.

Sylence

Community-Fossil

Beiträge: 1 663

Beruf: Softwareentwickler

  • Private Nachricht senden

4

23.07.2011, 16:16

Doch du bist drauf gekommen, nur willst du die Lösung nicht ;)
Die Textbox einfach als Attribut der Klasse definieren.

5

23.07.2011, 16:22

Guuut, dann mache ich das nun doch so :P.

Vielen Dank nochmal Sylence :)

6

10.08.2011, 09:55

Was ich persönlich übersichtlicher und eleganter finde, wäre es dem Event eine anonyme Methode und noch besser eine anonyme Methode in Lambda-Expression zu übergeben.
Also ungefähr so:

C#-Quelltext

1
2
3
...
button1.Click += (p,c) => doSth(p,c,"arg", "s...");
...


Für die Lambda-Expressions wird allerdings das .Net-Framework 3.5 vorausgesetzt (Oder gar das 4er? bin mir jetzt nicht ganz sicher).

7

11.08.2011, 09:30

3.5 reicht... Habe hier auf der Arbeit "nur" das 3.5er und ich habe Lambda Expressions ;)

Werbeanzeige