Событие WInforms Combobox SelectionChangeCommitted не всегда меняет SelectedValue - PullRequest
3 голосов
/ 23 марта 2012

У меня есть приложение 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 действительно изменилось?В качестве альтернативы приветствуются идеи для надежного обходного пути.

1 Ответ

2 голосов
/ 29 марта 2012

Удалите эту строку из вашей формы и повторите попытку

.DataBindings.Add("SelectedValue", Me.m_dsBidResults, Company.company_id")

Explanantion:
Этот код сообщает combobx, что его свойство SelectedValue должно быть привязано к company_id набора данных. Что бесполезно, потому что вы уже добавили список, установив источник данных, и вы сказали, что представляют собой valuemember и displaymember. Затем вы реализовали свою собственную логику того, что она должна делать при изменении значения, используя событие SelectionChangeCommitted. Дополнительная строка, которую вы удалили, будет полезна, только если у вас есть другой связанный объект, например, типа Person, у которого есть свойство, показывающее, в какой компании он работает. В этом сценарии, когда изменяется поле со списком, вы хотите, чтобы select company_id был передан объекту Person. Что-то вроде

personBindingsource1.DataSource = somePerson;
cboCompany.DataBindings.Add("SelectedValue", personBindingsource1, "WorksAtCompany")

Надеюсь, теперь это имеет смысл:)

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