ABOUT Visual Basic Programmieren Programmierung Download Downloads Tips & Tricks Tipps & Tricks Know-How Praxis VB VBA Visual Basic for Applications VBS VBScript Scripting Windows ActiveX COM OLE API ComputerPC Microsoft Office Microsoft Office 97 Office 2000 Access Word Winword Excel Outlook Addins ASP Active Server Pages COMAddIns ActiveX-Controls OCX UserControl UserDocument Komponenten DLL EXE
Diese Seite wurde zuletzt aktualisiert am 13.01.2003

Diese Seite wurde zuletzt aktualisiert am 13.01.2003
Aktuell im ABOUT Visual Basic-MagazinGrundlagenwissen und TechnologienKnow How, Tipps und Tricks rund um Visual BasicActiveX-Komponenten, Controls, Klassen und mehr...AddIns für die Visual Basic-IDE und die VBA-IDEVBA-Programmierung in MS-Office und anderen AnwendungenScripting-Praxis für den Windows Scripting Host und das Scripting-ControlTools, Komponenten und Dienstleistungen des MarktesRessourcen für Programmierer (Bücher, Job-Börse)Dies&Das...

Themen und Stichwörter im ABOUT Visual Basic-Magazin
Code, Beispiele, Komponenten, Tools im Überblick, Shareware, Freeware
Ihre Service-Seite, Termine, Job-Börse
Melden Sie sich an, um in den vollen Genuss des ABOUT Visual Basic-Magazins zu kommen!
Informationen zum ABOUT Visual Basic-Magazin, Kontakt und Impressum

Zurück...

Suchen im ListView

Zurück...


Anzeige

(-hg) mailto:hg_lvwfind@aboutvb.de

Mittels der Methode FindItem können Sie ein ListView-Steuerelement nach ListItems oder ListSubItems (Version 6) bzw. SubItems (Versionen 5 und 6) durchsuchen, deren Text-Eigenschaft einem bestimmten Text entspricht oder mit diesem anfängt. Eine Suche nach einem Text, der Platzhalter (Wildcards) enthält, ist damit jedoch nicht möglich.

Eine Alternative dazu finden Sie in der folgenden Funktion ListViewFind (für Version 6 - eine Variante für Version 5 finden Sie weiter unten). Die Funktion gibt Ihnen alle gefundenen Elemente in einer Collection zurück.

Im Parameter Find übergeben Sie den zu suchenden Text, der entsprechend dem Like-Operator Wildcards enthalten kann.

Im optionalen Parameter FindIn legen Sie fest, ob nur die ListItems selbst oder allein die ListSubItems (Elemente der Spalten) oder beide durchsucht werden sollen (Voreinstellung lfBoth).

Im nächsten Parameter ReturnBoth legen Sie fest, ob im Falle der Suche (auch) nach ListSubItems das zugehörige ListItem zurückgegeben werden soll. In diesem Fall wird ein Variant-Array in die Collection eingefügt, das in seinem ersten Element das ListItem und im zweiten Element das ListSubItem enthält. Somit können Sie auch bei der Suche nach ListSubItems die betreffende Zeile des ListViews verarbeiten, obwohl ein ListSubItem selbst an sich keinen Rückschluss auf sein Besitzer-ListItem gibt (das ist wohl eine Schwäche im Entwurf der ListSubItems).

Die Vergleichsmethode können Sie im vorletzten optionalen Parameter festlegen (Voreinstellung lfCompareBinary). Da in einem Modul nur eine Vergleichsmethode festgelegt werden kann (Standard ist Option Compare Binary), erfolgen die Vergleiche für die Option lfCompareText in einem separaten Modul (modLikeCompareText), das Sie ebenfalls in das betreffende Projekt laden müssen (siehe "Like Binary oder Text" khwlikecompare.htm).

Im letzten optionalen Parameter können Sie schließlich noch mit der Übergabe von Trueangeben, ob die Zeile des ersten gefundenen Elements selektiert und in den sichtbaren Bereich geschoben werden soll.

Option Compare Binary

Public Enum ListViewFindCompareMethodConstants
  lfCompareBinary
  lfCompareText
End Enum

Public Enum ListViewFindInConstants
  lfItems = 1
  lfSubItems = 2
  lfBoth = 3
End Enum

Public Function ListViewFind(ListView As ListView, Find As String, _
 Optional ByVal FindIn As ListViewFindInConstants = lfBoth, _
 Optional ByVal ReturnBoth As Boolean = True, _
 Optional ByVal CompareMethod As ListViewFindCompareMethodConstants, _
 Optional ByVal SelectFirst As Boolean) As Collection

  Dim nListItem As ListItem
  Dim nListSubItem As ListSubItem
  Dim nFound As Collection
  
  Set nFound = New Collection
  Select Case CompareMethod
    Case lfCompareBinary
      Select Case FindIn
        Case lfItems
          For Each nListItem In ListView.ListItems
            If nListItem.Text Like Find Then
              nFound.Add nListItem
            End If
          Next
        Case lfSubItems
          For Each nListItem In ListView.ListItems
            For Each nListSubItem In nListItem.ListSubItems
              If nListSubItem.Text Like Find Then
                If ReturnBoth Then
                  nFound.Add Array(nListItem, nListSubItem)
                Else
                  nFound.Add nListSubItem
                End If
              End If
            Next
          Next
        Case lfBoth
          For Each nListItem In ListView.ListItems
            If nListItem.Text Like Find Then
              nFound.Add nListItem
            End If
            For Each nListSubItem In nListItem.ListSubItems
              If nListSubItem.Text Like Find Then
                If ReturnBoth Then
                  nFound.Add Array(nListItem, nListSubItem)
                Else
                  nFound.Add nListSubItem
                End If
              End If
            Next
          Next
      End Select
    Case lfCompareText
      Select Case FindIn
        Case lfItems
          For Each nListItem In ListView.ListItems
            If LikeCompText(nListItem.Text, Find) Then
              nFound.Add nListItem
            End If
          Next
        Case lfSubItems
          For Each nListItem In ListView.ListItems
            For Each nListSubItem In nListItem.ListSubItems
              If LikeCompText(nListSubItem.Text, Find) Then
                If ReturnBoth Then
                  nFound.Add Array(nListItem, nListSubItem)
                Else
                  nFound.Add nListSubItem
                End If
              End If
            Next
          Next
        Case lfBoth
          For Each nListItem In ListView.ListItems
            If LikeCompText(nListItem.Text, Find) Then
              nFound.Add nListItem
            End If
            For Each nListSubItem In nListItem.ListSubItems
              If LikeCompText(nListSubItem.Text, Find) Then
                If ReturnBoth Then
                  nFound.Add Array(nListItem, nListSubItem)
                Else
                  nFound.Add nListSubItem
                End If
              End If
            Next
          Next
      End Select
  End Select
  Set ListViewFind = nFound
  If SelectFirst Then
    If nFound.Count Then
      Select Case True
        Case IsArray(nFound(1))
          With nFound(1)(0)
            .Selected = True
            .EnsureVisible
          End With
        Case TypeOf nFound(1) Is ListItem
          With nFound(1)
            .Selected = True
            .EnsureVisible
          End With
      End Select
    End If
  End If
End Function

Die Variante für Version 5 rufen Sie auf gleiche Weise auf. Lediglich der Inhalt der zurückgegebenen Collection unterscheidet sich von der Variante für Version 6. Wenn Sie hier nur bzw. auch die SubItems durchsuchen lassen, enthält die Collection Arrays, die jeweils das ListItem und den Index des SubItems enthalten. Ist die Fundstelle der Text des ListItems selbst, lautet der Index 1.

Option Compare Binary

Public Enum ListView5FindCompareMethodConstants
  lf5CompareBinary
  lf5CompareText
End Enum

Public Enum ListView5FindInConstants5
  lf5Items = 1
  lf5SubItems = 2
  lf5Both = 3
End Enum

Public Function ListViewFind5(ListView As ListView, Find As String, _
 Optional ByVal FindIn As ListView5FindInConstants = lf5Both, _
 Optional ByVal CompareMethod As ListView5FindCompareMethodConstants) _
 As Collection

  Dim nListItem As ListItem
  Dim nListSubItem As ListSubItem
  Dim nFound As Collection
  Dim i As Integer
  Dim nColumnHeadersCount As Integer
  
  Set nFound = New Collection
  With ListView
    Select Case CompareMethod
      Case lf5CompareBinary
        Select Case FindIn
          Case lf5Items
            For Each nListItem In .ListItems
              If nListItem.Text Like Find Then
                nFound.Add nListItem
              End If
            Next
          Case lf5SubItems
            nColumnHeadersCount = .ColumnHeaders.Count
            For Each nListItem In .ListItems
              With nListItem
                For i = 2 To nColumnHeadersCount
                  If .SubItems(i) Like Find Then
                    nFound.Add Array(nListItem, i)
                  End If
                Next 'i
              End With
            Next
          Case lf5Both
            nColumnHeadersCount = .ColumnHeaders.Count
            For Each nListItem In .ListItems
              With nListItem
                If .Text Like Find Then
                  nFound.Add Array(nListItem, 1)
                End If
                For i = 2 To nColumnHeadersCount
                  If .SubItems(i) Like Find Then
                    nFound.Add Array(nListItem, i)
                  End If
                Next 'i
              End With
            Next
        End Select
      Case lf5CompareText
        Select Case FindIn
          Case lf5Items
            For Each nListItem In .ListItems
              If LikeCompText(nListItem.Text, Find) Then
                nFound.Add nListItem
              End If
            Next
          Case lf5SubItems
            nColumnHeadersCount = .ColumnHeaders.Count
            For Each nListItem In .ListItems
              With nListItem
                For i = 2 To nColumnHeadersCount
                  If LikeCompText(.SubItems(i), Find) Then
                    nFound.Add Array(nListItem, i)
                  End If
                Next 'i
              End With
            Next
          Case lf5Both
            nColumnHeadersCount = .ColumnHeaders.Count
            For Each nListItem In .ListItems
              With nListItem
                If LikeCompText(.Text, Find) Then
                  nFound.Add Array(nListItem, 1)
                End If
                For i = 2 To nColumnHeadersCount
                  If LikeCompText(.SubItems(i), Find) Then
                    nFound.Add Array(nListItem, i)
                  End If
                Next 'i
              End With
            Next
        End Select
    End Select
  End With
  Set ListViewFind5 = nFound
End Function

Da alle Tag-Eigenschaften ab Version 6 des ListView-Steuerelements auch Objekte aufnehmen können, hilft Ihnen die Funktion ListViewFindObjectInTags bei der Suche nach dem Element, dem Sie ein Objekt zugeordnet haben. Auch hier können Sie die ListItems alleine, die ListSubItems oder beide durchsuchen. Die Funktion gibt das erste gefundene Element zurück.

Public Function ListViewFindObjectInTags(ListView As ListView, _
 Object As Object, _
 Optional ByVal FindIn As ListViewFindInConstants = lfBoth) _
 As Object

  Dim nListItem As ListItem
  Dim nListSubItem As ListSubItem
  
  Select Case FindIn
    Case lfItems
      For Each nListItem In ListView.ListItems
        With nListItem
          If IsObject(.Tag) Then
            Set ListViewFindObjectInTags = .Tag
            Exit Function
          End If
        End With
      Next
    Case lfSubItems
      For Each nListItem In ListView.ListItems
        For Each nListSubItem In nListItem.ListSubItems
          With nListSubItem
            If IsObject(.Tag) Then
              Set ListViewFindObjectInTags = .Tag
              Exit Function
            End If
          End With
        Next
      Next
    Case lfBoth
      For Each nListItem In ListView.ListItems
        With nListItem
          If IsObject(.Tag) Then
            Set ListViewFindObjectInTags = .Tag
            Exit Function
          End If
          For Each nListSubItem In .ListSubItems
            With nListSubItem
              If IsObject(.Tag) Then
                Set ListViewFindObjectInTags = .Tag
                Exit Function
              End If
            End With
          Next
        End With
      Next
  End Select
End Function

Module für Version 5 und 6 und Beispiel-Projekt (lvwfind.zip - ca. 5,6 KB)


Artikel
Zum Download-Bereich dieses Artikel
Mail an den Autor dieses Artikels

KnowHow
Zur KnowHow-Übersicht

KnowHow-Themen
Themen - Allgemeines
Themen - Entwicklungsumgebung (VB-IDE)
Themen - Forms
Themen - Steuerelemente (Controls)
Themen - Grafik
Themen - Dateien
Themen - UserControls
Themen - Einsteiger-Tipps
Themen - Wussten Sie...?

Übersicht nach Titeln in alphabetischer Reihenfolge
Übersicht nach Erscheinungsdatum

Schnellsuche




Zum Seitenanfang

Copyright © 1999 - 2017 Harald M. Genauck, ip-pro gmbh  /  Impressum

Zum Seitenanfang

Zurück...

Zurück...

Download Internet Explorer