EventHandler zeigt auf die falsche Funktion

Hallo Zusammen,

ich versuche seit dem WE dynamische Handler zu erzeugen, dazu habe ich eine Class mit den Funktionen und halt mein Hauptprogramm.

Es funktioniert eigentlich, nur zeigen nacher alle Button auf My4_Click und es soll ja jeder seinen eigenen Click haben.

Die Function Class sieht so aus:

namespace mynamespace
{
public sealed class myfunctions
{
public static void My1_Click(object sender, EventArgs e)
{
MessageBox.Show(„Funktion 1“);
}

public static void My2_Click(object sender, EventArgs e)
{
MessageBox.Show(„Funktion 2“);
}

public static void My3_Click(object sender, EventArgs e)
{
MessageBox.Show(„Funktion 3“);
}

public static void My4_Click(object sender, EventArgs e)
{
MessageBox.Show(„Funktion 4“);
}
}
}

Dazu werden Button dynamisch erzeugt und die Events via CreateInstance zugewissen (oder besser, sie sollen …):

namespace mynamespace
{
public partial class Form1 : Form
{

Type TargetScr;
object TargetObj;
MethodInfo TargetMethod;
EventHandler[] TargetHandler = new EventHandler[10];

public Form1()
{
TargetScr = Type.GetType(„mynamespace.myfunctions“);
for(int i=0;i

Hallo!

Ich hab’ Dein Beispiel mal ausprobiert und festgestellt, dass es an der Zuweisung der TargetMethod liegt. Du hast nur eine Referenz auf eine MethodInfo und die überbügelst Du in der Schleife immer wieder.
Beim tatsächlichen Durchlaufen des anonymen Delegate wird der aktuelle Wert der TargetMethod genommen und der steht zu diesem Zeitpunkt auf My4_Click.

Entfernen muss man die EventHandler mittels RemoveEventHandler, ein einfaches Nullsetzen sollte nicht ausreichen.

Gruß,
Martin

Hallo Martin,

danke für Deine Hilfe.
Das Problem ist es ja, dass ich keine Instanzen von DokumentInfo bilden kann.
Hast Du dafür noch eine Lösung? Oder vielleicht eine Idee, wie man es auf anderen Weg bewerkstellen kann, dass jede Button seinen eigenen Event hat?

Danke,

Andre

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo Martin,

Hallo nochmal!

danke für Deine Hilfe.
Das Problem ist es ja, dass ich keine Instanzen von
DokumentInfo bilden kann.

? DokumentInfo war bisher nirgends erwähnt…

Hast Du dafür noch eine Lösung? Oder vielleicht eine Idee, wie
man es auf anderen Weg bewerkstellen kann, dass jede Button
seinen eigenen Event hat?

Nimm statt des EventHandler-Arrays (in dem jede Instanz das gleich ausschaut und das damit überflüssig ist) ein Array von MethodInfos - die Zielmethoden sollen sich ja unterscheiden.

Danke,

Gerne doch,

Gruß,
Martin

Andre

Hallo!

Ich hab’ Dein Beispiel mal ausprobiert und festgestellt, dass
es an der Zuweisung der TargetMethod liegt. Du hast nur eine
Referenz auf eine MethodInfo und die überbügelst Du in der
Schleife immer wieder.
Beim tatsächlichen Durchlaufen des anonymen Delegate wird der
aktuelle Wert der TargetMethod genommen und der steht zu
diesem Zeitpunkt auf My4_Click.

Entfernen muss man die EventHandler mittels
RemoveEventHandler, ein einfaches Nullsetzen sollte nicht
ausreichen.

Gruß,
Martin

Sorry, klar, es war natürlich MethodInfo gemeint…

Aber das mit dem Array habe ich schon versucht (und gerade zur Sicherheit noch einmal getestet) - und auch mit einem MethodInfo und EventHandler Array -
es wird immer My4_Click aufgerufen, sprich das Problem bleibt das Gleiche.

Ironischer Weise sehe ich ja im Debugger, dass jedesmal auf eine andere MethodInfo gezeigt wird.
Aber nach dem einbinden des Events ist das Problem da …

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Aber das mit dem Array habe ich schon versucht (und gerade zur
Sicherheit noch einmal getestet) - und auch mit einem
MethodInfo und EventHandler Array -
es wird immer My4_Click aufgerufen, sprich das Problem bleibt
das Gleiche.

Versuch mal, die Erzeugung deines anonymen Delegates in eine Untermethode auszulagern, die in der for-Schleife vier mal aufgerufen wird. Die umgebenden lokalen Variablen werden im Delegate nämlich so gespeichert, wie sie am FunktionsENDE sind. D.h. die bereits erzeugten drei Delegates bekommen in deinem Code ihr Objekt beim vierten Schleifendurchlauf „unter dem Hintern“ wegersetzt. Erst wenn der Stackframe am Funktionsende abgebaut wird, werden diese lokalen Variablen „endgültig“ gespeichert.

Viele Grüße,
Sebastian

Danke Sebastian - genial!
Ich fürchte, da wäre ich nie drauf gekommen…
Es geht und ich habe gelernt, dass man Schleifen nicht unbedingt trauen darf :smile:

Versuch mal, die Erzeugung deines anonymen Delegates in eine
Untermethode auszulagern, die in der for-Schleife vier mal
aufgerufen wird. Die umgebenden lokalen Variablen werden im
Delegate nämlich so gespeichert, wie sie am FunktionsENDE
sind. D.h. die bereits erzeugten drei Delegates bekommen in
deinem Code ihr Objekt beim vierten Schleifendurchlauf „unter
dem Hintern“ wegersetzt. Erst wenn der Stackframe am
Funktionsende abgebaut wird, werden diese lokalen Variablen
„endgültig“ gespeichert.

Viele Grüße,
Sebastian