Autor Beitrag
Pete550
Hält's aus hier
Beiträge: 10



BeitragVerfasst: Sa 21.08.10 13:53 
Hallo Zusammen.


Ich habe erst vor kurzen mit Csharp angefangen und habe ein Problem bei dem ich nicht weiterkomme.
CSharp2010

Vereinfacht:
Gegeben ist ein Form mit einem (eigentlich mehreren) Label.
Dieses Label soll einen Eventhandler bekommen.
Aus sämtlichen Klassen / Threads im selben Namespace möchte ich ein Event auf dieses Label feuern können.

Mein Code funktioniert bestens solange ich alle Klassen / Funktionen direkt von Form 1 aufrufe.
Wenn ich Verschachtelt von class1 auf class2 aufrufe funktioniert das Event in class2 nicht mehr.
woran liegt das? was ist mein Fehler?

vielen Dank und viele Grüße.


Hier ist mein bisheriger stark vereinfachter Code:

ausblenden volle Höhe 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:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
public partial class Form1 : Form
    {
Class1 class1 = new Class1();
Class2 class2 = new Class2();
 public Form1()
        {
            InitializeComponent();
            class1.ProgressChanged += new EventHandler<ProgressChangedArgs>(OnWorkerProgressChanged);  
            class2.ProgressChanged += new EventHandler<ProgressChangedArgs>(OnWorkerProgressChanged); 
        }

private void OnWorkerProgressChanged(object sender, ProgressChangedArgs e)   
        {
            if (this.InvokeRequired)
            {
                this.BeginInvoke((MethodInvoker)delegate
                {
                    OnWorkerProgressChanged(sender, e);
                });
                return;
            } 
            this.label1.Text = e.Progress;
        }

private void button_read_Click(object sender, EventArgs e)
        {
            t1 = new Thread(thread1);
            t1.IsBackground = true;
            t1.Start();
        }
public void thread1()
        {
            class1.C1Test(); //dieser Event funktioniert.
            //class2.C2Test(); //dieses Event funktioniert.
        }



 public class ProgressChangedArgs : EventArgs
    {
        public string Progress { get; private set; }

        public ProgressChangedArgs(string progress)
        {
            Progress = progress;
        }
    }

class Class1
    {
Class2 class2 = new Class2();
public event EventHandler<ProgressChangedArgs> ProgressChanged;
        protected void OnProgressChanged(ProgressChangedArgs e)
        {
            if (ProgressChanged != null)
            {
                ProgressChanged(this, e);
            }
        }
public void C1Test()
        {
OnProgressChanged(new ProgressChangedArgs("test von C1"));
class2.C2Test(); // Hier erfolgt der verschachtelte Aufruf. Form1->class1->class2 Das Event in class2 funktioniert nicht mehr. Erfolgt der Aufruf von Form1 funktioniert es. Es muss am verschachtelten liegen.
}
}

class Class2
    {
public event EventHandler<ProgressChangedArgs> ProgressChanged;
        protected void OnProgressChanged(ProgressChangedArgs e)
        {
            if (ProgressChanged != null)
            {
                ProgressChanged(this, e);
            }
        }
public void C2Test()
        {
OnProgressChanged(new ProgressChangedArgs("test von C2"));
}
}
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Sa 21.08.10 14:07 
:welcome:

Du erstellst zweimal eine Class2-Instanz, einmal in Form1 und einmal in Class1. Aber nur bei der ersten Instanz abonnierst du das Event mit +=. Das musst du auch im Class1-Konstruktor machen und im angehängten Eventhandler dann OnProgressChanged zur Weitergabe aufrufen.

PS: Merkwürdige Einrückung hast du da :) .

_________________
>λ=
Pete550 Threadstarter
Hält's aus hier
Beiträge: 10



BeitragVerfasst: Sa 21.08.10 15:20 
huhu Kha


habe es entsprechend umgesetzt getestet und es funktioniert :D

Vielen Dank für deine Hilfe
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: Sa 21.08.10 15:58 
Bitte markiere deine Frage als erledigt, damit Hilfestellende gleich sehen, dass sie das Thema nicht durchlesen müssen. Klicke dazu einfach auf user defined image oberhalb des ersten Postings. Danke! :)