Кажется, что когда у вас есть приложение WinForms .NET и ComboBox (установлен стиль «DropDown»), а ComboBox содержит несколько одинаковых элементов, происходят странные вещи. В частности, индекс выбранного элемента может измениться без , вызвав событие SelectedIndexChanged.
Конечно, это вызывает массовое замешательство и странные, неясные ошибки, из-за которых я недавно вырвал свои волосы.
Вот простой пример, который вы можете использовать, чтобы увидеть, о чем я говорю:
- Создайте новый проект .NET WinForms (я использую VB.NET, но не стесняйтесь переводить - это достаточно просто).
- Перетащите ComboBox, кнопку и TextBox (установите MultiLine = True) на форму.
- Используйте следующий код для загрузки ComboBox с 3 одинаковыми элементами и для печати некоторых сообщений о состоянии при возникновении события SelectedIndexChanged, а также для просмотра текущего выбранного индекса (с помощью кнопки):
Private Sub ComboBox1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ComboBox1.SelectedIndexChanged
TextBox1.Text = TextBox1.Text & vbNewLine & "ComboBox SelectedIndexChanged event fired." & vbNewLine & _
"SelectedIndex is: " & ComboBox1.SelectedIndex
End Sub
Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
ComboBox1.Items.Add("John Doe")
ComboBox1.Items.Add("John Doe")
ComboBox1.Items.Add("John Doe")
End Sub
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
TextBox1.Text = TextBox1.Text & vbNewLine & _
"Button clicked." & vbNewLine & _
"SelectedIndex is: " & ComboBox1.SelectedIndex
End Sub
Запустите проект и выберите элемент в ComboBox (скажем, средний). Затем щелкните стрелку раскрывающегося списка ComboBox, но НЕ ВЫБИРАЙТЕ НИЧЕГО. Нажмите кнопку (по умолчанию Button1) и посмотрите, что она говорит.
Если я не сошел с ума, вот что вы должны увидеть:
ComboBox SelectedIndexChanged event fired.
SelectedIndex is: 1
Button clicked.
SelectedIndex is: 0
Другими словами, ИЗБРАННЫЙ ИНДЕКС ИЗМЕНЕН, но без срабатывания события SelectedIndexChanged!
Это происходит только тогда, когда элементы в ComboBox идентичны. Если они разные, этого не происходит. (Этого также не происходит, если стиль «DropDown» в ComboBox установлен на «DropDownList».)
Я подозреваю, что это может быть ошибка в самой платформе .NET, и не то, что я могу исправить, но есть вероятность, что у кого-то еще есть какие-либо идеи о том, что делать здесь (или что я могу делать неправильно!), пожалуйста, перезвоните! Я затрудняюсь объяснить это поведение или обойти его (я ожидаю, что SelectedIndex останется прежним, если, вы знаете, вы фактически НЕ ИЗМЕНИТЕ его, выбрав что-то еще!)