Пытаясь предварительно выбрать одно значение в 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
элементе управления?