ComboBox, другое поведение в Windows 7 и 8.1

Я переписываю приложение в VB 2012, которое управляет/редактирует/распечатывает индекс уставов. Это указатель, который можно найти в конце книги, но он содержит 2500 основных статей, таких как «Выборы», «Налогообложение», «Школы» и т. д. Более 190 000 записей соответствуют основным статьям. В напечатанном виде занимает четыре тома.

Чтобы помочь пользователям, приложение берет 2500 основных записей и определяет, какие пары букв присутствуют на основе двух начальных букв основных записей. Эти пары букв загружаются в поле со списком. Когда пользователь выбирает пару букв, другое поле со списком заполняется основными элементами, начинающимися с этих букв. На моем компьютере с Windows 8.1 были протестированы различные методы выбора пар букв, и все они работали. Когда началось пользовательское тестирование, при установке в Windows 7 была отмечена аномалия внешнего вида, хотя функциональность работала. Вот некоторый код, демонстрирующий проблему:

Private Sub LoadMe(sender As Object, e As EventArgs) Handles MyBase.Load

    'some letter pairs
    ComboBox1.Items.AddRange(
        New String() {"Ab", "Ac", "Ad", "Az", "El", "En"})

    ComboBox1.DropDownStyle = ComboBoxStyle.DropDownList
    ComboBox1.AutoCompleteSource = AutoCompleteSource.ListItems
    ComboBox1.AutoCompleteMode = AutoCompleteMode.Suggest

    ComboBox2.Items.AddRange(
        New String() {"Ab", "Ac", "Ad", "Az", "El", "En"})

    ComboBox2.DropDownStyle = ComboBoxStyle.DropDownList
    ComboBox2.AutoCompleteSource = AutoCompleteSource.ListItems
    ComboBox2.AutoCompleteMode = AutoCompleteMode.Suggest

    ActiveControl = ComboBox1
End Sub

Private Sub ComboBox1_SelectionChangeCommitted(sender As Object, e As EventArgs) Handles ComboBox1.SelectionChangeCommitted
    Debug.WriteLine("CB1Committed Index: [{0}] Text: [{1}]",
                      ComboBox1.SelectedIndex,
                      ComboBox1.Text)
    ComboBox2.Select()
End Sub

Private Sub ComboBox2_Enter(sender As Object, e As EventArgs) Handles ComboBox2.Enter
    Debug.WriteLine("Enter Index: [{0}] Text: [{1}]",
                      ComboBox1.SelectedIndex,
                      ComboBox1.Text)
End Sub

Чтобы продемонстрировать проблему, запустите приложение и выполните следующие действия, обращая внимание на то, что отображается в ComboBox1.

'  Type ab
'  press Enter (selected value of combobox1 is ab)
'  press shift tab
'  Type ab
'  press Enter (selected value of combobox1 is now ac)

Если вы запустите это в Windows 7, в ComboBox1 будет отображаться «Ac», а если в 8, он будет правильно отображать «Ab». Мой вопрос: как мне заставить это правильно отображаться в Windows 7? Отладка показывает разрыв между отображаемыми и фактическими значениями.


person dbasnett    schedule 24.07.2014    source источник
comment
Попробуйте добавить событие KeyDown для CombBox1 и добавьте этот код ComboBox1.FindString(Asc(e.KeyCode)). Я попытался ввести ab, он перешел к Ab, а затем, когда я нажал a (пока нет b), я перешел к Ac. Однако после того, как я нажму букву b, он вернется к значению списка, которое равно Ab.   -  person Edper    schedule 24.07.2014


Ответы (2)


Это ошибка Windows 7, попробуйте установить исправление из следующей статьи:

Поле со списком выбирает неожиданное значение в Windows 7 SP 1 или Windows Server 2008 R2

person David -    schedule 24.07.2014
comment
Спасибо. Не видел этого во всех поисках, которые я сделал. - person dbasnett; 25.07.2014

Я нашел обходной путь.

Private Sub ComboBox1_SelectionChangeCommitted(sender As Object, e As EventArgs) Handles ComboBox1.SelectionChangeCommitted
    Debug.WriteLine("CB1Committed Index: [{0}] Text: [{1}]",
                      ComboBox1.SelectedIndex,
                      ComboBox1.Text)
    Dim foo As Integer = ComboBox1.SelectedIndex '<<<<<fix
    ComboBox2.Select()
    ComboBox1.SelectedIndex = foo '<<<<fix
End Sub
person dbasnett    schedule 25.07.2014