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 (...);
По завершении загрузки данных подпишитесь еще раз.