Как предварительно выбрать значение в ListBox в форме MS-Access? - PullRequest
2 голосов
/ 12 апреля 2020

Пытаясь предварительно выбрать одно значение в ListBox с одним выбором (.MultiSelect = False) в MS-Access (текущий 365) по коду, я обнаружил, что настройка .Selection(i) может привести к несоответствиям, если смешивать с использованием .Value вместо .ItemData(i):

  • Настройка .Seletion(i) делает не установкой .Value, но выделяет строку (поэтому пользователь должен думать, что выбрано значение).
  • Установка .Value в значение , которого нет в списке (что возможно!) Удаляет выбор (=> может использоваться в качестве проверки значения для списка: set .Value и check If .ItemsSelected.Count > 0).
  • .Selected(i) всегда соответствует .ItemData(i) => возможно, более надежный подход?

Тестовый код (чтобы увидеть поведение выделения, вам нужно закомментировать некоторые шаги ):

Private Sub cmdTest_Click()
    With Me.lstSingle
        FillList ' "eins", "zwei", "drei", "vier" (code see below)
        Debug.Print ".ItemData(1)", ".Value", "Selected(1)", "Selected(2)"
        ' note: rows count from 0

        Debug.Print .ItemData(1), .Value, .Selected(1), .Selected(2)
        ' result:   zwei          Null    0             0             no selection shown

        .Value = "test" ' assign a value not in the list
        Debug.Print .ItemData(1), .Value, .Selected(1), .Selected(2)
        ' result:   zwei          test    0             0             no selection shown

        .Selected(1) = True ' set selection on second row
        Debug.Print .ItemData(1), .Value, .Selected(1), .Selected(2)
        ' result:   zwei          test     -1           0             second row highlighted
        '                         ^^^^                                ^^^^^^^^^^^^^^^^^^^^^^

        .Value = "drei" ' assign a value that is in the list
        Debug.Print .ItemData(1), .Value, .Selected(1), .Selected(2)
        ' result:   zwei          drei     0            -1            third row highlighted

        .Selected(1) = True ' set selection back on second row
        Debug.Print .ItemData(1), .Value, .Selected(1), .Selected(2)
        ' result:   zwei          drei    -1             0            second row highlighted
        '                         ^^^^                                ^^^^^^^^^^^^^^^^^^^^^^

        .Value = "test" ' assign a value not in the list (again)
        Debug.Print .ItemData(1), .Value, .Selected(1), .Selected(2)
        ' result:   zwei          test    0             0             no selection shown
    End With
End Sub

'results compared
'.ItemData(1)  .Value  Selected(1)  Selected(2)
'zwei          Null    0            0             no selection shown
'zwei          test    0            0             no selection shown
'zwei          test    -1           0             second row highlighted
'zwei          drei    0            -1            third row highlighted
'zwei          drei    -1           0             second row highlighted
'zwei          test    0            0             no selection shown


Private Sub FillList()
    With Me.lstSingle
        ' clear list
        .RowSource = vbNullString

        ' fill list
        Dim vA As Variant
        vA = Array("eins", "zwei", "drei", "vier")
        Dim i As Long
        For i = LBound(vA) To UBound(vA)
            .AddItem vA(i)
        Next i
    End With
End Sub

Каков наилучший способ предварительного выбора значения в ListBox элементе управления?

1 Ответ

1 голос
/ 15 апреля 2020

Да, я тоже научился этому (трудному пути) долгое время go.

Но вы уже ответили на свой вопрос: установка .Value - это путь к go.
Особенно, если вы прочитаете значение позже, и пользователь никогда не сможет изменить выбор по умолчанию.

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