Entwickler-Ecke

Basistechnologien - Probleme beim Event-Handling


glowhand - Mo 26.07.10 18:44
Titel: Probleme beim Event-Handling
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:

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.


Kha - 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 - 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 - 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:


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 - 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.