vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
sevAniGif - als kostenlose Vollversion auf unserer vb@rchiv CD Vol.5  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   RSS-Feeds  | Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2019
 
zurück
Rubrik: Controls · ListBox   |   VB-Versionen: VB4, VB5, VB622.11.01
Suchen in einer Combo- oder Standard-ListBox

Eine Funktion, mit der sich der Inhalt einer ComboBox oder normalen Standard-ListBox nach einem bestimmten Eintrag durchsuchen lässt.

Autor:   Dieter OtterBewertung:     [ Jetzt bewerten ]Views:  18.289 
www.tools4vb.deSystem:  Win9x, WinNT, Win2k, WinXP, Vista, Win7, Win8, Win10 Beispielprojekt auf CD 

Im nachfolgenden möchten wir Ihnen verschiedene Möglichkeiten zum Durchsuchen einer ComboBox bzw. Standard-ListBox zeigen. Hierbei kommt u.a. auch eine WinAPI-Funktion zum Einsatz, mit der sich eine Liste sehr schnell durchsuchen lässt. Diese Variante hat jedoch einen Nachteil: Die Suche kann nicht global innerhalb eines Eintrags erfolgen, wobei zusätzlich auch immer die Groß-/Kleinschreibung ignoriert wird.

Unsere Suchfunktion soll aber universell einsetzbar sein, d.h. es soll auch möglich sein, global oder nach Teilbegriffen zu suchen, mit oder ohne Berücksichtigung der Groß-/Kleinschreibung.

Die Funktion selbst lässt sich sehr einfach verwenden. Als ersten Parameter übergeben Sie der Funktion das Control (also ComboBox oder ListBox). Der zweite Parameter legt den Suchbegriff fest. Soll nach einem Teilbegriff gesucht werden, verwenden Sie folgende "Regeln":

  • globale Suche innerhalb der Einträge: *Begriff*
  • Teilbegriff von links übereinstimmend: Begriff*
  • Teilbegriff von rechts übereinstimmend: *Begriff
  • exakte Übereinstimmung: Begriff
Der dritte Parameter ist optional und gibt an, ab welcher Position die Suche beginnen soll. Wird dieser Parameter nicht angegeben, so startet die Suche immer mit dem ersten Eintrag der Liste (Index = 0). Der vierte Parameter ist ebenfalls optional und gibt an, ob die Groß-/Kleinschreibung berücksichtigt oder unberücksichtigt bleiben soll.

Und hier ist sie - die Universal-Suchroutine für Combo- und ListBoxen:

' zunächst die benötigten API-Deklarationen
Private Declare Function SendMessage Lib "user32" _
  Alias "SendMessageA" ( _
  ByVal hwnd As Long, _
  ByVal wMsg As Long, _
  ByVal wParam As Long, _
  ByVal lParam As String) As Long
 
Private Const LB_FINDSTRING = &H18F
Private Const LB_FINDSTRINGEXACT = &H1A2
Private Const CB_FINDSTRING = &H14C
Private Const CB_FINDSTRINGEXACT = &H158
' Universal-Suchroutine für Combo-/Listboxen
Public Function IsItemInList(Liste As Control, _
  ByVal strItem As String, _
  Optional ByVal lngStart As Long = 0, _
  Optional ByVal bIgnoreCase As Boolean = False) As Long
 
  Dim Index As Long
  Dim I As Long
  Dim lngCount As Long
  Dim lngLen As Long
  Dim wMsg As Long
 
  ' Kann die schnelle API-Funktion verwendet werden?
  ' Voraussetzung:
  ' exakte Suche, oder Suche nach Teilbegriff von links
  ' UND Groß-/Kleinschreibung ignorieren
  If Left$(strItem, 1) <> "*" And bIgnoreCase Then
    ' Voraussetzungen erfüllt!
    If TypeOf Liste Is ListBox Then
      wMsg = IIf(Right$(strItem, 1) = "*", _
        LB_FINDSTRING, LB_FINDSTRINGEXACT)
    Else
      wMsg = IIf(Right$(strItem, 1) = "*", _
        CB_FINDSTRING, CB_FINDSTRINGEXACT)
    End If
 
    If Right$(strItem, 1) = "*" Then _
      strItem = Left$(strItem, Len(strItem) - 1)
 
    If lngStart = 0 Then lngStart = -1
    Index = SendMessage(Liste.hwnd, wMsg, _
      lngStart, strItem)
    If Index < lngStart Then Index = -1
 
  ElseIf Left$(strItem, 1) <> "*" And _
    Right$(strItem, 1) <> "*" And bIgnoreCase = False Then
    ' exakte Suche unter Berücksichtigung der
    ' Groß-/Kleinschreibung
    Index = -1
    With Liste
      lngCount = .ListCount - 1
      For I = lngStart To lngCount
        If .List(I) = strItem Then
          Index = I: Exit For
        End If
      Next I
    End With
 
  ElseIf Left$(strItem, 1) <> "*" And _
    Right$(strItem, 1) = "*" And bIgnoreCase = False Then
    ' Suche beginnend von links unter Berücksichtigung
    ' der Groß-/Kleinschreibung
    strItem = Left$(strItem, Len(strItem) - 1)
    lngLen = Len(strItem)
    Index = -1
    With Liste
      lngCount = .ListCount - 1
      For I = lngStart To lngCount
        If Left$(.List(I), lngLen) = strItem Then
          Index = I: Exit For
        End If
      Next I
    End With
 
  ElseIf Left$(strItem, 1) = "*" And _
    Right$(strItem, 1) <> "*" And bIgnoreCase = False Then
    ' Suche beginnend von rechts unter Berücksichtigung
    ' der Groß-/Kleinschreibung
    strItem = Mid$(strItem, 2)
    lngLen = Len(strItem)
    Index = -1
    With Liste
      lngCount = .ListCount - 1
      For I = lngStart To lngCount
        If Right$(.List(I), lngLen) = strItem Then
          Index = I: Exit For
        End If
      Next I
    End With
 
  Else
    ' Globale Suche oder Suche von rechts beginnend,
    ' Groß-/Kleinschreibung ignorieren
    Index = -1
    With Liste
      lngCount = .ListCount - 1
      For I = lngStart To lngCount
        If .List(I) Like strItem Then
          Index = I: Exit For
        End If
      Next I
    End With
  End If
 
  IsItemInList = Index
End Function

Nun ist die Funktion doch ziemlich umfangreich. Man hätte natürlich gerade die vier letzten "Blöcke" als einen Blockzusammenfassen können, doch wären dann pro Durchlauf (1...ListCount) ziemlich viele If...Then...Else Abfragen notwendig, was die Suche in umfangreichen Listen doch erheblich verlangsamt. Aus diesem Grund haben wir alle Suchvarianten einzeln behandelt.

Nur für diejenigen, die wissen möchten, wie man die letzten vier Blöcke hätte zusammenfassen können - hier der Code:

lngLen = Len(strItem) - 1
Index = -1
With Liste
  lngCount = .ListCount - 1
  For I = lngStart To lngCount
    If Left$(strItem, 1) <> "*" And _
      Right$(strItem, 1) <> "*" And bIgnoreCase = False Then
      ' exakte Suche unter Berücksichtigung der
      ' Groß-/Kleinschreibung
      If .List(I) = strItem Then Index = I: Exit For
 
    ElseIf Left$(strItem, 1) <> "*" And _
      Right$(strItem, 1) = "*" And bIgnoreCase = False Then
      ' Suche beginnend von links unter Berücksichtigung
      ' der Groß-/Kleinschreibung
      If Left$(.List(I), lngLen) = Left$(strItem, lngLen) Then
        Index = I: Exit For
      End If
 
    ElseIf Left$(strItem, 1) = "*" And _
      Right$(strItem, 1) <> "*" And bIgnoreCase = False Then
      ' Suche beginnend von rechts unter Berücksichtigung
      ' der Groß-/Kleinschreibung
      If Right$(.List(I), lngLen) = Mid$(strItem, 2) Then
        Index = I: Exit For
      End If
 
    Else
      ' Globale Suche oder Suche von rechts beginnend,
      ' Groß-/Kleinschreibung ignorieren
      If .List(I) Like strItem Then Index = I: Exit For
 
    End If
  Next I
End With

Dieser Tipp wurde bereits 18.289 mal aufgerufen.

Voriger Tipp   |   Zufälliger Tipp   |   Nächster Tipp

Über diesen Tipp im Forum diskutieren
Haben Sie Fragen oder Anregungen zu diesem Tipp, können Sie gerne mit anderen darüber in unserem Forum diskutieren.

Neue Diskussion eröffnen

nach obenzurück


Anzeige

Kauftipp Unser Dauerbrenner!Diesen und auch alle anderen Tipps & Tricks finden Sie auch auf unserer aktuellen vb@rchiv  Vol.6
(einschl. Beispielprojekt!)

Ein absolutes Muss - Geballtes Wissen aus mehr als 8 Jahren vb@rchiv!
- nahezu alle Tipps & Tricks und Workshops mit Beispielprojekten
- Symbol-Galerie mit mehr als 3.200 Icons im modernen Look
Weitere Infos - 4 Entwickler-Vollversionen (u.a. sevFTP für .NET), Online-Update-Funktion u.v.m.
 
   

Druckansicht Druckansicht Copyright ©2000-2019 vb@rchiv Dieter Otter
Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.

Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel