Fire comboBox SelectedIndexChanged только от пользователя

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

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

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

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

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

Ответы

Ответ 1

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

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

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

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

Ответ 2

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

Combo1.SelectedIndexChanged += new EventHandler Combo1_SelectedIndexChanged;

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

Решение2: Его предпочтение и я использую его регулярно. Измените событие смены выбора следующим образом:

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

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

Ответ 3

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

Из Библиотека MSDN - ComboBox.SelectionChangeCommitted Event

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

Ответ 4

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

if(combo.ContainsFocus){ MyEventLogic();}

Ответ 5

  • Решение. Если вы заполняете combobox со статическими значениями только одними, просто заполните их и after подпишитесь на событие из кода. Не используйте WinForms Designer для подписки на него.
  • Если это невозможно во время загрузки, можно:

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

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

    b) Unsubsribe из события:

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

    comboBox.SelectedIndexChanged + = delegate (...);

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

    comboBox.SelectedIndexChanged - = delegate (...);

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