Остановить два элемента управления, вызывающих событие друг друга - PullRequest
0 голосов
/ 11 октября 2010

Допустим, у меня есть TabControl с 2 вкладками и TreeView с 2 узлами в корне.

Я хочу, чтобы приложение работало следующим образом: если я щелкну по Node1 в древовидной структуре, Tab1 из TabControl должен стать активным. Точно так же, когда я нажимаю на Tab2, я хочу, чтобы Node2 стал выбранным. И наоборот.

Так что я просто закодировал это с помощью TreeView_AfterSelect и TabControl_SelectedIndexChanged.

Как избежать "условий гонки" между двумя элементами управления, так как они вызывают событие друг друга?

Ответы [ 2 ]

1 голос
/ 11 октября 2010

Просто выполните проверку в каждом событии, чтобы убедиться, что узел / вкладка, которые вы намереваетесь выбрать, еще не выбран.На самом деле это не «состояние гонки».Условие гонки - это когда порядок двух событий не гарантирован.

Например:

private void MyTreeView_AfterSelect (object sender, EventArgs e) {
    if (MyTreeView.SelectedNode == node2 && MyTab.SelectedIndex != 1 ) {
        MyTab.SelectedIndex = 1;
    }
}
0 голосов
/ 11 октября 2010

Это все в потоке пользовательского интерфейса, не знаю, о каких условиях гонки вы говоритеКроме того, события не должны заботиться о других событиях.События происходят в не гарантированный момент времени.Создание приложения в зависимости от событий без определенной архитектуры событий в вашем приложении создаст множество ночных кошмаров.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...