Fire ComboBox SelectedIndexChanged только от клика пользователя - PullRequest
17 голосов
/ 30 сентября 2011

Я написал метод для обработки события SelectedIndexChanged comboBox.

В конструкторе я заполнил comboBox, и это активировало мой метод обработки событий. Что я не хочу, так как никто не нажал на comboBox.

Есть ли простой способ заставить comboBox не запускать событие, если пользователь не щелкнул по нему?

Если это невозможно, есть ли способ временно отключить событие от метода? Могу ли я просто установить "my_combo.SelectedIndexChanged = null", а затем создать новый System.EventHandler?

Или, я думаю, я мог бы создать какую-то переменную логического члена, которую я мог бы включить или выключить и поставить проверку ветвления в моем методе. Хотя это похоже на кучу.

Ответы [ 5 ]

32 голосов
/ 30 сентября 2011

Я делал это много раз. Решение 1. Удалите EventHandler из конструктора. Заполните поле со списком и установите EventHandler.

Combo1.SelectedIndexChanged += new EventHandler Combo1_SelectedIndexChanged;

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

Solution2: Это мое предпочтение, и я использую его регулярно. Измените ваше событие изменения выбора как:

private void cb1_SelectedIndexChanged(object sender, EventArgs e)
{
   ComboBox cb = (ComboBox)sender;
   if(!cb.Focused)
   {
      return;
   }
   // Here is your Code for selection change
}

Так что теперь событие будет запущено, только если оно в фокусе. Надеюсь, вы искали то же самое. Надеюсь, что это поможет

30 голосов
/ 19 ноября 2012

Не уверен, используется ли это сейчас, но я нашел этот ответ , который кажется мне чище.

Из библиотеки MSDN - событие ComboBox.SelectionChangeCommitted

" SelectionChangeCommitted вызывается только тогда, когда пользователь изменяет выбор поля со списком. Не используйте SelectedIndexChanged или SelectedValueChanged чтобы фиксировать изменения пользователя, потому что эти события также возникают, когда выбор изменяется программно. "

9 голосов
/ 30 сентября 2011

Вы можете использовать оба предложенных вами метода:

  1. использовать логическую переменную
  2. отсоединить метод события, заполнить поле со списком, прикрепить метод события как этот

    my_combo.SelectedIndexChanged -= my_Combo_SelectedIndexChanged;
    populateCombo();
    
    my_combo.SelectedIndexChanged += my_Combo_SelectedIndexChanged;
    

my_Combo_SelectedIndexChanged - это имя метода, который вы прикрепили к событию.

4 голосов
/ 23 июля 2013

Я бы использовал control.ContainsFocus вместо создания другого bool. Предостережение заключается в том, что вы должны убедиться, что пользователь сфокусирован на этом элементе управления. Либо клавишей, либо мышью.

if(combo.ContainsFocus){ MyEventLogic();}
2 голосов
/ 30 сентября 2011
  1. Решение: Если вы заполняете комбинированный список только статическими значениями, просто заполните их и after подпишитесь на событие из кода. Не используйте WinForms Designer, чтобы подписаться на него.
  2. Если это невозможно во время загрузки, можно:

    a) определите логическую переменную bool loading, установите ее на true, прежде чем начинать заполнять комбо данными, и в проверке обработчика событий

    если (нагрузка) возвращение;

    б) Отписаться от события:

    Если подписка была:

    comboBox.SelectedIndexChanged + = делегат (...);

    Отмена подписки перед началом загрузки данных:

    comboBox.SelectedIndexChanged - = делегат (...);

Когда загрузка данных завершится, подпишитесь снова.

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