Альтернативы SelectedIndexChanged, которые не срабатывают при загрузке формы?

Я разрабатываю VB.NET с Visual Studio 2005.

У меня есть ComboBox (myCombo) в форме, которая заполняется методом Load.

Я также обработал myCombo.SelectedIndexChanged, чтобы изменить метку в форме.

Редактировать. Я добавил обработчик событий, дважды щелкнув поле со списком в конструкторе. Затем скелетный код появился в представлении кода.

Похоже, что когда форма загружается, SelectedIndexChanged срабатывает каждый раз, когда элемент добавляется в myCombo.

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

Вот код того, что у меня есть:

Private Sub myDlg_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

    ' this is all I do with myCombo in this sub

    list = GetListOfItemsToAdd()
    myCombo.DataSource = list 
    myCombo.DisplayMember = "DisplayMember"
    myCombo.ValueMember = "ValueMember"

End Sub

Может ли кто-нибудь указать мне в правильном направлении?

Спасибо как всегда.

Обновление: решение, которое я использовал, состояло в том, чтобы удалить предложение Handles после генератора событий и добавить его перед "End Sub" выше:

AddHandler myCombo.SelectedIndexChanged, AddressOf myCombo_SelectedIndexChanged

Всем спасибо!


person John    schedule 24.12.2009    source источник
comment
Я не смог воспроизвести вашу проблему. Я добавил ComboBox и создал событие SelectedIndexChanged в дизайнере. В Form_Load я добавлял элементы (используя comboBox1.Items.Add(xx)) и каждый раз, когда я добавлял элемент, SelectedIndexChanged не срабатывал. Интересно, вызвана ли ваша проблема тем, как вы настроили свой ComboBox в своей форме.   -  person Jay Riggs    schedule 24.12.2009
comment
Джей, спасибо за попытку! Я попробую еще немного пройтись по коду, чтобы увидеть, действительно ли то, что я сказал, происходит.   -  person John    schedule 24.12.2009
comment
Я смог воспроизвести вашу проблему с вашим фрагментом кода. Мне нравится решение SLaks; это сработало для меня!   -  person Jay Riggs    schedule 24.12.2009
comment
Джей, я добавил информацию о том, как я добавил обработчик событий для поля со списком. Я просто дважды щелкнул поле со списком в форме. Тогда это должно автоматически добавлять обработчик событий (где-то я этого не хотел)?   -  person John    schedule 24.12.2009


Ответы (3)


Вы можете добавить обработчик событий только после загрузки данных. (Используя ключевое слово AddHandler)

person SLaks    schedule 24.12.2009
comment
SLaks, я добавил информацию о том, как я добавил обработчик события для выпадающего списка (дважды щелкнул выпадающий список на форме). Мне нужно как-то вытащить этот (автоматически добавленный) обработчик событий, чтобы сделать то, что вы предлагаете? - person John; 24.12.2009
comment
Удалите предложение Handles из определения метода обработчика. - person SLaks; 24.12.2009
comment
Один из способов сделать это — в конструкторе выбрать поле со списком, перейти в окно свойств, нажать кнопку «События» и найти (и удалить) запись в элементе SelectedIndexChanged. - person Jay Riggs; 24.12.2009

SelectionChangeCommitted — это обработчик событий, который вызывается, когда пользователь изменяет выбор ComboBox.

Из документации MSDN для SelectionChangeCommitted:

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

Однако обратите внимание, что существует ошибка, которая означает, что в некоторых случаях событие SelectionChangeCommitted не запускается (в частности: используйте клавиатуру, чтобы раскрыть список, прокрутите до нового элемента, а затем перейдите к другому элементу управления. Выбор изменен, но Событие SelectionChangeCommitted не запускается). См. http://connect.microsoft.com/VisualStudio/feedback/details/115189/selectionchangecommitted-event-sometimes-not-raised-by-combobox

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

person Joe    schedule 24.12.2009
comment
+1 это единственный ответ, который фактически отвечает на вопрос, а не предлагает обходной путь. Ничего плохого в обходных путях, но я предпочитаю это. - person Colin Pickard; 03.12.2010

У вас может быть логическое значение, которое вы используете, чтобы определить, делаете ли вы изменения. Когда вы начнете менять элементы, установите его на true. Когда вы закончите, установите его на false. В обработчике событий вы можете проверить логическое значение, чтобы определить, является ли пользователь инициатором изменений, и игнорировать событие, если нет.

person Zach Johnson    schedule 24.12.2009
comment
Теперь, когда вы упомянули об этом, я думаю, что действительно сделал это на некоторых других формах! Спасибо за напоминание. - person John; 24.12.2009