2008-09-19 1 views
0

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

ответ

2

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

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

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

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

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

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) 

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

Смежные вопросы