У меня есть приложение WinForms, созданное с VB.Net в VS 2010, и я почесываю голову над следующей проблемой.
У меня есть форма с полем со списком, который связывается с источником данных, когдазагружена форма:
With Me.cboCompany
.DataBindings.Clear()
.DataSource = Me.m_dsBidResults.Tables("Company")
.ValueMember = "company_id"
.DisplayMember = "company_name"
.DataBindings.Add("SelectedValue", Me.m_dsBidResults, Company.company_id")
End With
Я использую событие cboCompany.SelectionChangeCommitted для фильтрации сетки данных по выбранному идентификатору компании:
Private Sub cboCompany_SelectionChangeCommitted(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cboCompany.SelectionChangeCommitted
Dim intCompanyIDN As Integer
intCompanyIDN = CInt(cboCompany.SelectedValue)
SelectBidder(intCompanyIDN) ' sub to filter datagridview, update labels
End Sub
Это работает нормально, еслипользователь не переключает фокус на какой-либо другой элемент управления, а затем возвращается в комбинированный список.После переключения фокуса, если пользователь затем меняет выбор в выпадающем списке на первый элемент в раскрывающемся списке (SelectedIndex = 0), событие SelectionChangeCommitted запускается, но SelectedValue остается установленным на ранее выбранное значение.Я подтвердил это, добавив окно сообщения в вышеупомянутом обработчике событий, отображая SelectedIndex и SelectedValue бок о бок.
'add this to SelectionChangeCommitted event handler
MsgBox(String.Format("Selected Index: {0}, Selected Value: {1}", cboCompany.SelectedIndex, cboCompany.SelectedValue))
ЭТОГО НЕ происходит, если пользователь изменяет SelectedIndex на что-либо, кроме 0;все ведет себя как ожидалось.Я проверил, что таблица, к которой я привязываюсь, содержит уникальные значения для company_id и company_name.
Нужно ли использовать какое-то другое событие, чтобы убедиться, что SelectedValue действительно изменилось?В качестве альтернативы приветствуются идеи для надежного обходного пути.