2010-10-10 1 views
0

Disons que j'ai un TabControl avec 2 onglets et un TreeView avec 2 nœuds à la racine.Arrêter deux contrôles qui déclenchent l'événement de l'autre

Je souhaite que l'application se comporte de la manière suivante: si je clique sur Node1 à partir de l'arborescence, la Tab1 de TabControl devrait devenir active. De même, lorsque je clique sur Tab2, je veux que le Node2 soit sélectionné. Et vice versa.

J'ai donc simplement codé ceci avec TreeView_AfterSelect et TabControl_SelectedIndexChanged.

Comment éviter les "conditions de concurrence" entre les 2 contrôles puisqu'ils déclenchent l'événement de l'autre?

Répondre

1

Effectuez simplement une vérification dans chaque événement pour vous assurer que le nœud/onglet que vous avez l'intention de sélectionner n'est pas déjà sélectionné. Ce n'est pas réellement une "condition de course". Une condition de concurrence est lorsque l'ordre de deux événements n'est pas garanti.

Par exemple:

private void MyTreeView_AfterSelect (object sender, EventArgs e) { 
    if (MyTreeView.SelectedNode == node2 && MyTab.SelectedIndex != 1) { 
     MyTab.SelectedIndex = 1; 
    } 
} 
+0

merci, je ne parlais pas de conditions course (threads) en tant que tel, mais ne savait pas comment il mot :) cela semble assez bon pour bloquer le déclenchement des événements en cascade . – ibiza

0

Tout est dans le fil de l'interface utilisateur, vous ne savez pas exactement de quelles conditions de course vous parlez. En outre, les événements ne devraient pas se préoccuper d'autres événements. Les événements ne sont pas garantis dans le temps. Construire une application en fonction des événements sans une architecture d'événement définie dans votre application va créer de nombreux cauchemars en aval.

Questions connexes