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



BeitragVerfasst: Di 05.10.10 15:08 
Hallo,

ich habe eine ganz allgemeine Frage:

Wenn ich mich innerhalb eines Events von z.B. einer ComboBox befinde und ich den Auslöser des Events intern verändere, wird dann der gleiche Event wieder aufgerufen oder wird das unterbunden? Wenn ja/ nein: Gibt es Sonderregeln bzw. Situationen wo das anders ist?


Als kleines zwei Zeilen Bspl:

private void comboBoxtest_SelectedIndexChanged(object sender, EventArgs e)
{
this.comboboxtest.SelectedIndex = 2; // Wird hier Event ausgelöst?
}

Denn derzeitig melde ich den Eventhandler immer vor einer Änderung mit -= ab und anschließend mit += wieder an. Ist das notwendig?

Gruß

Bernhard N.
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4798
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Di 05.10.10 15:35 
Üblicherweise verwendet man dazu einfach eine boolesche Variable (anstatt dem Abhängen und wieder Anhängen):
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
private bool exclude_event = false;

private void comboBoxtest_SelectedIndexChanged(object sender, EventArgs e)
{
  if(exclude_event) return;

  exclude_event = true;
  this.comboboxtest.SelectedIndex = 2;
  exclude_event = false;
}

Wenn jedoch an dem Event noch andere Methoden hängen, so werden diese dann trotzdem aufgerufen.

Nützlich dürfte für dich auch folgender Beitrag sein Event nur bei Benutzeraktion auslösen, nicht bei programmtechnischer Änderung
bernieserver Threadstarter
Hält's aus hier
Beiträge: 5



BeitragVerfasst: Do 07.10.10 09:00 
Danke. Also war die anfängliche Version mit Flags (die ich vorher einsetzte) gar nicht so verkehrt.

Wie sieht es denn mit der Atomarität der Ausführung aus? Können Eventaktionen per Default unterbrochen werden?

Gruß
Bernhard
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4798
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Do 07.10.10 09:52 
Hallo,

Events werden völlig sequentiell abgearbeitet, d.h. treten innerhalb eines Events andere auf, so werden diese dann erst weiter abgearbeitet (evtl. sogar rekursiv!) und so weiter.
Dies bezieht sich selbstverständlich nur auf den Thread, in dem die Events abgearbeitet werden - andere Threads können selbstverständlich die Events unterbrechen (technisch gibt es keinen Unterschied zwischen Events und normalen Methoden). Und von "atomar" kann man hier auch nicht wirklich reden.

Bei einem WinForms-Timer könnte es sogar sein, daß dieser verzögert erst aufgerufen wird (wenn ein Event zu lange zum Abarbeiten braucht). Als Standardregel sollte gelten, daß Events (im GUI-Thread) nicht länger als ca. 10ms dauern sollten (alles andere sollte dann in separate Threads ausgelagert werden).