Autor Beitrag
hoegeug
Hält's aus hier
Beiträge: 2



BeitragVerfasst: Di 25.07.23 11:28 
Hallo, ich bin neu in C# und bin, so wie es aussieht, mit den Events noch ziemlich auf Kriegsfuß.
Mein Programm besteht aus dem UserControl 'UserControl1', welches mit dem Visual Studio Designer erzeugt wurde und mit zwei Buttons enthält und einer Windows Form 'Form1', in welche das UserControl eingefügt ist. Das abgebildete Programm ist eine stark vereinfachte Version, damit ich leichter verstehe was darin passiert.
Ich möchte, dass wenn einer der Buttons gedrückt wird, die Methode 'DoSomething' in der Klasse Form1 ausgeführt wird.
Nun zu meinem Problem: Wenn ich das Programm laufen lasse und einen der beiden Buttons drücke, dann lande ich zwar in der Methode 'OnEreignis', aber 'Ereignis' hat immer den Wert 'null'.
Seit einigen Tagen durchforste ich schon das Netz nach einer funktionierenden Lösung und habe auch schon unzählige Lösungsansätze ausprobiert, das Richtige war bis jetzt leider nicht dabei. Der Wert blieb immer 'null'.
Was muss ich machen, dass ich hier einen Wert ungleich null bekomme, damit 'DoSomething' angesprungen wird? Kann mir da jemand auf die Sprünge helfen.
Ich möchte mich auf jeden Fall schon mal für Eure Unterstützung bedanken.

Hier mein WinForms:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        uc1.Ereignis += new UserControl1.MyEventHandler(DoSomething);
    }
  
  UserControl1 uc1 = new UserControl1();

    private void DoSomething(object source, EventArgs e)
    {
        MessageBox.Show("Juhu");
    }
}


Hier mein UserControl:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
public partial class UserControl1: UserControl
{
    public delegate void MyEventHandler(object source, EventArgs e); //Der Delegate

    public event MyEventHandler Ereignis; //Der Eventhandler

    public UserControl1()
    {
        InitializeComponent();
    }

    private void buttonUp_Click(object sender, EventArgs e)
    {
        OnEreignis();
    }

    private void buttonDown_Click(object sender, EventArgs e)
    {
        OnEreignis();
    }

    protected void OnEreignis()
    {
        //Registrierte EReignisbehandlungsmethode ausführen
        if (Ereignis != null)
        {
            DoSomething(thisnew EventArgs());
        }
    }
}
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Di 25.07.23 13:49 
Hallo und :welcome:

du hast in Zeile 13 ein neues UserControl erstellt. Stattdessen mußt du das Ereignis für das vom Designer erzeugte UserControl abonnieren (der Name wird standardmäßig userControl1 o.ä. lauten - diesen kannst du aber im Designer in den Eigenschaften für das UserControl1 auch ändern).

Ansonsten sollte dein Code aber korrekt sein (Edit: bzw. fast, s.u.).

PS: Auch die Namen der Klassen Form1, UserControl1 etc. solltest du besser benennen.
PPS: Beim Abonnieren reicht einfach
ausblenden C#-Quelltext
1:
userControl.Ereignis += DoSomething;					

Und statt ein eigenes Delegate zu erstellen, kannst du einfach den vordefinierten benutzen:
ausblenden C#-Quelltext
1:
public event EventHandler Ereignis;					

Und zuletzt noch:
Kürzer geht es beim Aufruf des Ereignisses mit:
ausblenden C#-Quelltext
1:
2:
3:
4:
protected void OnEreignis()
{
   Ereignis?.Invoke(this, EventArgs.Empty);
}

(das DoSomething(...) in deinem Code ist aber ein Fehler).

Für diesen Beitrag haben gedankt: hoegeug
hoegeug Threadstarter
Hält's aus hier
Beiträge: 2



BeitragVerfasst: Di 25.07.23 17:09 
Hallo Th69,

danke für Dein herzliches Willkommen und Deine rasch Antwort - hat super funktioniert.
Ich hoffe, dass ich das irgendwann mal kapiere.
Das mit dem Umbenennen kannte ich schon, habe es der Einfachheit halber nur so gelassen.
Auf jeden Fall noch einmal Danke.