ComboBox. SelectedValue не соответствует отображаемому тексту когда DropDownStyle = DropDownList в Windows 7

Скажем, у нас есть следующий код в Приложении Windows:

ComboBox comboBox = new ComboBox()
{
    AutoCompleteMode = AutoCompleteMode.SuggestAppend,
    AutoCompleteSource = AutoCompleteSource.ListItems,
    DataSource = new string[] { "", "Ark", "Boat", "Bucket" },
    DropDownStyle = ComboBoxStyle.DropDownList
};
this.Controls.Add(comboBox);

TextBox textBox = new TextBox()
{
    Left = comboBox.Right,
    Top = comboBox.Top,
    ReadOnly = true
};
textBox.DataBindings.Add("Text", comboBox, "SelectedValue");
this.Controls.Add(textBox);

Никакое волшебство здесь, просто a ComboBox связанный со списком строк. TextBox дисплеи SelectedValue из ComboBox.

Я получаю неожиданное поведение, когда я ввожу "Блок" в ComboBox и вкладка далеко. По некоторым причинам ComboBox дисплеи "Лодка", но TextBox дисплеи "Блок". Я ожидал бы, что они оба отобразят "Блок".

Это ведет себя как ожидалось, если я изменяюсь DropDownStyle кому: DropDown, но я не хочу, чтобы пользователи смогли ввести что-либо, что они хотят. Они должны только смочь ввести объекты, которые находятся в списке.

Еще более интересный то, что, после ввода "Блока" и переключения вкладок далеко, если я ввожу "Блок" снова, он отобразит "Блок" в обоих. Если я предпринимаю третью попытку, она возвращается для "Плавания на лодке" для ComboBox и "Блок" для 'Текстового поля'. Таким образом, кажется, что это циклически повторяется через весь B.

Я не заметил это, пока я недавно не обновил от XP до Windows 7. Я не вижу, как это могло иметь какое-либо отношение к этому, но я вывожу его так или иначе.

Если это поведение корректно, кто-либо может сказать мне, что я должен делать для достижения моего ожидаемого поведения?

ОБНОВЛЕНИЕ Это казалось бы этим, связано с Windows 7. Все ведет себя как ожидалось в Режиме Windows XP. Может кто-либо еще запускающий Windows 7 пробует мой код и проверяет, что я не являюсь сумасшедшим?

12
задан Michael S. Scherotter 15 February 2010 в 04:27
поделиться

2 ответа

Обходным путем может быть изменение DropDownStyle на DropDownDown и добавление следующего:

comboBox.Validating += new CancelEventHandler((o, e) =>
    {
        e.Cancel = (comboBox.DataSource as string[]).Contains(comboBox.Text) == false;
    });

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

Тем не менее, недовольны изменением поведения с XP на Win 7.

.
6
ответ дан 2 December 2019 в 22:05
поделиться

Я знаю, что этот ответ довольно старый, но мне нужен был ответ на эту ошибку Windows 7. Некоторое время я возился в стиле Ecyrb и пришел к следующему обходному пути:

Из InitForm() для Application Add this property:

Me.KeyPreview = True

Из того, где находится ComboBox:

Private mbTab As Boolean 
Private miPrevIndex As Integer = -1
Private Sub DropDownListEx_Validating(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles Me.Validating
   miPrevIndex = Me.SelectedIndex
   MyBase.OnSelectedIndexChanged(e)
End Sub
Private Sub DropDownListEx_PreviewKeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.PreviewKeyDownEventArgs) Handles Me.PreviewKeyDown
   mbTab = e.KeyCode = Windows.Forms.Keys.Tab
End Sub
Protected Overrides Sub OnDropDownClosed(ByVal e As System.EventArgs)
    MyBase.OnDropDownClosed(e)
    If Me.SelectedIndex <> miPrevIndex Then
        If mbTab = True Then
            Me.SelectedIndex = miPrevIndex
        Else
            miPrevIndex = Me.SelectedIndex
        End If
        MyBase.OnSelectedIndexChanged(e)
    End If
End Sub

Теперь, в моем примере, я использую пользовательский элемент управления, который наследует comboBox. Поэтому вам нужно будет соединить эти элементы для вашего собственного использования.

0
ответ дан 2 December 2019 в 22:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: