Autor Beitrag
glowhand
Hält's aus hier
Beiträge: 5



BeitragVerfasst: Mo 26.07.10 18:44 
Hallo!
Ich bin ein ziemlicher .NET-Anfänger und habe eine hoffentlich einfach zu beantwortende Frage:

Anscheinend kann ich in Methoden, die per EventHandling aufgerufen wurden, nicht auf lokale Klassenattribute zugreifen. Wie mache ich das möglich?

Beispiel:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
private void button1_Click(object sender, EventArgs e)
{
     Session sess = new Session();
     sess.itemReceived += new FooBarHandler("foo_bar");
}

private void foo_bar(Session sess, Item item)
{
     MessageBox.Show("foobar"); // => funzt
     this.TexBox.Text = "item received"// => funzt nicht
}


Der Compiler gibt keine Fehlermeldung aus und es wird auch kein Laufzeitfehler ausgegeben :(

Lg,
Christian.


Zuletzt bearbeitet von glowhand am Mo 26.07.10 19:07, insgesamt 1-mal bearbeitet
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Mo 26.07.10 19:06 
Doch, das ist auf jeden Fall möglich, es kompiliert ja schließlich auch. Das Verhalten muss einen anderen Grund haben (hoffentlich nicht CheckForIllegalCrossThreadCalls = false gesetzt ;) )?

_________________
>λ=
glowhand Threadstarter
Hält's aus hier
Beiträge: 5



BeitragVerfasst: Mo 26.07.10 19:09 
user profile iconKha hat folgendes geschrieben Zum zitierten Posting springen:
Doch, das ist auf jeden Fall möglich, es kompiliert ja schließlich auch. Das Verhalten muss einen anderen Grund haben (hoffentlich nicht CheckForIllegalCrossThreadCalls = false gesetzt ;) )?


Hi,
habe CheckForIllegalCrossThreadCalls nochmal explizit auf true gesetzt, trotzdem ändert sich da nichts. Weiterhin keine Fehlermeldung.
Merkwürdig.
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: Mo 26.07.10 20:17 
Vielleicht wird itemReceived aus einem anderen Thread aus aufgerufen, aber dann müsste eigentlich eine Exception geworfen werden, wenn der Schalter, den user profile iconKha angesprochen hat, nicht abgeschaltet ist. Du könntest aber einfach mal versuchen, es so zu machen, wie man es im Falle dieser Exception tun würde:

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
private void button1_Click(object sender, EventArgs e)
{
     Session sess = new Session();
     sess.itemReceived += new FooBarHandler("foo_bar");
}

private void foo_bar(Session sess, Item item)
{
     MessageBox.Show("foobar"); // => funzt
     setTextBoxText("item received");
}

private void setTextBoxText(string text) {
     if (TextBox.InvokeRequired)
          TextBox.Invoke(new Action<string>(setTextBoxText), text);
     else
          TexBox.Text = text;
}

Die Methode setTextBoxText prüft, ob der Text der Textbox ohne weiteres geändert werden kann, und wenn nicht, ruft sie sich selbst im Hauptthread auf. Schau auch mal per Einzelschritt, ob Invoke verwendet wird.

Grüße,
Yogu
glowhand Threadstarter
Hält's aus hier
Beiträge: 5



BeitragVerfasst: Mo 26.07.10 20:37 
Hey,vielen lieben Dank, so funktioniert es.
Frage ist nun: Wieso wird keine Exception geworfen :(

Das Session-Objekt ist eigentlich Teil einer fremden Library, deren Implementierung mich eigentlich recht wenig interessiert. Will mich da ungern einarbeiten, nur, um Fehler ausfindig zu machen, die Visual Studio nicht ausgibt.