Изменение ComboBox SelectedIndex без запуска события в C # - PullRequest
8 голосов
/ 28 июля 2010

В моем приложении C # есть comboBox с событием SelectedIndexChanged. Обычно я хочу, чтобы это событие сработало, но иногда мне нужно, чтобы оно не сработало. Мой comboBox - это список файлов MRU. Если файл в списке не существует, элемент удаляется из comboBox, а comboBox SelectedIndex устанавливается в ноль. Однако установка comboBox SelectedIndex в ноль вызывает событие SelectedIndexChanged, что в данном случае проблематично, поскольку в обработчике события запускается некоторый код UIF. Есть ли изящный способ отключить / включить события для элементов управления формы C #? Благодаря.

Ответы [ 4 ]

14 голосов
/ 28 июля 2010

Запустите метод обработчика событий с помощью

ComboBox combo = sender as ComboBox;
if (combo.SelectedIndex == 0)
{
    return;
}

Если у вас проблема с другим обработчиком событий, вы можете сначала удалить регистрацию события обработчика событий.

combo.SelectedIndexChanged -= EventHandler<SelectedIndexChangedEventArgs> SomeEventHandler;
combo.SelectedIndex = 0;
combo.SelectedIndexChanged += EventHandler<SelectedIndexChangedEventArgs> SomeEventHandler;
9 голосов
/ 14 сентября 2011

Я сталкивался с этим много раз за эти годы.Мое решение состоит в том, чтобы иметь переменную уровня класса с именем _noise, и если я знаю, что собираюсь изменить индекс комбинированного или любого другого подобного элемента управления, который срабатывает при изменении выбранного индекса, я делаю в коде следующее

private bool _noise;

Вот код для обработчика события управления

private void cbTest_SelectedIndexChange(object sender, EventArgs e)
{
   if (_noise) return;

   // process the events code

   ...

}

Затем, когда я знаю, что собираюсь изменить индекс, я делаю следующее:

_noise = true; // cause the handler to ignore the noise...


cbTest.Index = value;


_noise = false;  // let the event process again
3 голосов
/ 05 июня 2013

Я удивлен, что нет лучшего способа сделать это, но я так и делаю. Я на самом деле использую поле Tag большинства элементов управления, поэтому мне не нужно создавать подклассы элемента управления. И я использую true / null в качестве значений, так как null по умолчанию.

Конечно, если вы на самом деле используете Tag, вам нужно будет сделать это по-другому ...

В обработчике:

 private void control_Event(object sender, EventArgs e)
 {
    if (control.Tag != null ) return;

    // process the events code

    ...

 }

В основном коде

 try 
 {
    control.Tag = true;
    // set the control property
    control.Value = xxx;
or
    control.Index = xxx; 
or
    control.Checked = xxx;
    ...
 }
 finally 
 {
    control.Tag = null;
 }
1 голос
/ 28 июля 2010

Один (довольно уродливый) способ - установить флаг в коде, который удаляет запись, а затем проверить, что в обработчике SelectedIndexChanged:

if (!deletedEntry)
{
    // Do stuff
}
deletedEntry = false;

Лучший способ - удалитьSelectedIndexChanged обработчик событий в начале метода удаления и восстановление его в конце.Таким образом, ваш код не будет знать, что индекс изменился.

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