Наиболее эффективный способ узнать, находится ли элемент в списке управления - PullRequest
0 голосов
/ 20 сентября 2008

Этот запрос основан на MS Access VBA. Я хотел бы знать, каков наиболее эффективный способ, чтобы увидеть, существует ли элемент в элементе управления списка.

Ответы [ 3 ]

2 голосов
/ 20 сентября 2008

Вот примерная функция, которая может быть адаптирована для соответствия.

Function CheckForItem(strItem, ListB As ListBox) As Boolean
Dim rs As DAO.Recordset
Dim db As Database
Dim tdf As TableDef

    Set db = CurrentDb

    CheckForItem = False

    Select Case ListB.RowSourceType
        Case "Value List"
            CheckForItem = InStr(ListB.RowSource, strItem) > 0

        Case "Table/Query"
            Set rs = db.OpenRecordset(ListB.RowSource)

            For i = 0 To rs.Fields.Count - 1
                strList = strList & " & "","" & " & rs.Fields(i).Name
            Next

            rs.FindFirst "Instr(" & Mid(strList, 10) & ",'" & strItem & "')>0"

            If Not rs.EOF Then CheckForItem = True

        Case "Field List"

            Set tdf = db.TableDefs(ListB.RowSource)

            For Each itm In tdf.Fields
                If itm.Name = strItem Then CheckForItem = True
            Next

    End Select

End Function
1 голос
/ 20 сентября 2008

Если вы не возражаете прибегнуть к API Windows, вы можете найти строку вроде этой:

Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long   
Private Const LB_FINDSTRINGEXACT = &H1A2

Dim index as Integer
Dim searchString as String
searchString = "Target" & Chr(0)

index = SendMessage(ListBox1.hWnd, LB_FINDSTRINGEXACT , -1, searchString)

Который должен возвращать индекс строки, содержащей целевую строку.

1 голос
/ 20 сентября 2008

К сожалению, нет более эффективного способа, чем линейный поиск, если только вы не знаете, что ваш список отсортирован или проиндексирован каким-то особым образом.

For i = 1 To TheComboBoxControl.ListCount
  if TheComboBoxControl.ItemData(i) = "Item to search for" Then do_something()
Next i
...