Der hier Erstelle Suchdialog berücksichtigt dabei, ob in dem ListView-Control ein Multi-Row-Select möglich ist oder nicht. Als erstes erstellen wir ein Formular mit dem Namen frmFindInListView, das folgende Controls enthält:
Der Dialog sieht dann wie folgt aus: In das Formular kopiert man nun folgenden Sourcecode:Imports System.Windows.Forms Imports System.Text.RegularExpressions Public Class frmFindInListView Private objListview As ListView Private objMainForm As Form Private bolIngnoreColumnsWithZeroWidth As Boolean ' Wird benötigt umd bei einfach Auswhal festzusellen, das schon mal gesucht wurde Private bSearched As Boolean = False Private iLastFoundRowIndex As Integer = 0, iLastCheckedRowIndex As Integer Private bTextFound As Boolean = False Private Sub OK_Button_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles OK_Button.Click ' Alle Texte in LisView selektieren, in dem der Text vorkommt Dim i As Integer, y As Integer, iSearchStart As Integer Dim bShowMsg As Boolean = True Dim bExit As Boolean = False ' Wenn bei letzer Suche (Single-Select in ListView) die letzte ' Zeile erreicht wurde, dann Suche von neu beginnen If objListview.MultiSelect = False AndAlso _ iLastCheckedRowIndex = objListview.Items.Count - 1 Then bSearched = False iLastFoundRowIndex = 0 iLastCheckedRowIndex = 0 End If ' Startzeile für Suche festlegen (jenachdem ob Liste Multi-Select erlaub oder nicht) If objListview.MultiSelect = True Then iSearchStart = 0 ' alle Selektionen bei Multi-Select entfernen Dim oListViewItem As ListViewItem For Each oListViewItem In objListview.SelectedItems oListViewItem.Selected = False Next Else If bSearched = False Then ' Bei ersten Mal in erster Zeilen beginnen iSearchStart = 0 Else iSearchStart = iLastFoundRowIndex + 1 End If End If bSearched = True If combSearchColumn.SelectedIndex <> combSearchColumn.Items.Count - 1 Then ' Suche über eine Spalte For i = iSearchStart To objListview.Items.Count - 1 iLastCheckedRowIndex = i Try If ContainsPlus(objListview.Items(i).SubItems(combSearchColumn.SelectedIndex).Text, _ txtSearchText.Text, Not chkNonCaseSensetive.Checked, chkOnlyWholeWord.Checked, _ chkSearchTextIsRegEx.Checked) = True Then bTextFound = True iLastFoundRowIndex = i objListview.Select() objListview.Items(i).Selected = True If objListview.MultiSelect = False Then Exit For End If Catch ex As Exception If chkSearchTextIsRegEx.Checked = True Then MessageBox.Show("Fehler beim Auswerten des Regulären Ausdrucks!" & _ Environment.NewLine & Environment.NewLine & _ "Fehler:" & Environment.NewLine & ex.Message, _ "Fehler bei Regulären-Ausdruck", MessageBoxButtons.OK, MessageBoxIcon.Error) End If bShowMsg = False ExitFor End Try Next i Else ' Suche über alle Spalten For i = iSearchStart To objListview.Items.Count - 1 iLastCheckedRowIndex = i For y = 0 To objListview.Columns.Count - 1 'Versteckte Spalten überspringen Option entsprechend eingestellt If bolIngnoreColumnsWithZeroWidth = True AndAlso _ objListview.Columns(y).Width = 0 Then Continue For Try If ContainsPlus(objListview.Items(i).SubItems(y).Text, txtSearchText.Text, _ Not chkNonCaseSensetive.Checked, chkOnlyWholeWord.Checked, _ chkSearchTextIsRegEx.Checked) = True Then bTextFound = True iLastFoundRowIndex = i objListview.Select() objListview.Items(i).Selected = True If objListview.MultiSelect = False Then bExit = True ' Wenn eine Zeile Markiert wurde, müssen folgende Spalten ' nicht mehr geprüft werden Exit For End If Catch ex As Exception If chkSearchTextIsRegEx.Checked = True Then MessageBox.Show("Fehler beim Auswerten des Regulären Ausdrucks!" & _ Environment.NewLine & Environment.NewLine & _ "Fehler:" & Environment.NewLine & ex.Message, _ "Fehler bei Regulären-Ausdruck", MessageBoxButtons.OK, MessageBoxIcon.Error) End If bExit = True: Exit For End Try Next y If bExit Then Exit For Next i End If ' Wenn Text nicht gefunde wurde, dann Meldung If bShowMsg Then If bTextFound = False Then MessageBox.Show("Der Text konnte mit den angegebenen Suchkriterien nicht " & _ "in der Liste gefunden werden!", "Suche", MessageBoxButtons.OK, MessageBoxIcon.Information) Exit Sub End If End If ' Bei Multi-Select ListView Dialog schließen, bei Single-Select Liste scrollen If objListview.MultiSelect = True Then Me.DialogResult = System.Windows.Forms.DialogResult.OK Me.Close() Else If objListview.SelectedItems.Count <> 0 Then objListview.EnsureVisible(objListview.SelectedItems(0).Index) End If End If ' Hauptformular in den Vordergrund bringen, damit Selektion sichtbar wird objMainForm.BringToFront() End Sub Private Sub Cancel_Button_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles Cancel_Button.Click Me.DialogResult = System.Windows.Forms.DialogResult.Cancel Me.Close() End Sub Private Sub frmFindInListView_Load(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles MyBase.Load txtSearchText.Select() If objListview.MultiSelect = True Then OK_Button.Text = "OK" Else OK_Button.Text = "Weitersuchen" End If End Sub Public Overloads Sub Show(ByVal oListview As ListView, _ ByVal oMainForm As Form, _ Optional ByVal bIngnoreColumnsWithZeroWidth As Boolean = False) ' Alle Spalten des Listviews in Auswahl aufnehmen Dim i As Integer objListview = oListview objMainForm = oMainForm bolIngnoreColumnsWithZeroWidth = bIngnoreColumnsWithZeroWidth For i = 0 To objListview.Columns.Count - 1 If bIngnoreColumnsWithZeroWidth = True AndAlso _ objListview.Columns(i).Width = 0 Then Continue For combSearchColumn.Items.Add(objListview.Columns(i).Text) Next i combSearchColumn.Items.Add("-- ALLE SPALTEN --") combSearchColumn.SelectedIndex = combSearchColumn.Items.Count - 1 MyBase.Show(objListview) End Sub Public Overloads Sub ShowDialog(ByVal oListview As ListView, _ ByVal oMainForm As Form, _ Optional ByVal bIngnoreColumnsWithZeroWidth As Boolean = False) ' ShowDialog muss verwendet werden, damit Fokus wieder richtig ' gesetzt wird, wenn Dialog beendet wird Show(oListview, oMainForm) End Sub ''' <summary> ''' Diese Funktion prüft, ob eine Bestimmte Zeichenfolge oder ein Wort in einem Text vorkommt ''' </summary> ''' <param name="WholeText">Kompletter Text in dem geprüft werden soll</param> ''' <param name="ContainText">Zu suchender Text</param> ''' <param name="bIgnoreCase">Wenn True, wird Gross-/Kleinschreibung ignoriert</param> ''' <param name="bOnlyWholeWords">Wenn True, muss 'ContainText' als komplettes Wort ''' vorhanden sein und nicht nur in einer Zeichenkette vorkommen.</param> ''' <returns></returns> ''' <remarks></remarks> Private Function ContainsPlus(ByVal WholeText As String, _ ByVal ContainText As String, _ Optional ByVal bIgnoreCase As Boolean = True, _ Optional ByVal bOnlyWholeWords As Boolean = False, _ Optional ByVal bContainTextIsRegularExpression As Boolean = False) As String Dim tmpContainText As String = "" ' Wenn ContainText keine Regulären Ausdrücke enthält, dann ContainText in ' ASCI-Codes für REGEX umsetzen, damit z.B. ] nicht als Regulärer-Ausdruck ' interpretiert wird, sonstern als Text If bContainTextIsRegularExpression = False Then Dim byteArray() As Byte Dim hexNumbers As System.Text.StringBuilder = New System.Text.StringBuilder byteArray = System.Text.ASCIIEncoding.ASCII.GetBytes(ContainText) For i As Integer = 0 To byteArray.Length - 1 hexNumbers.Append("\x" & byteArray(i).ToString("x")) Next tmpContainText = hexNumbers.ToString Else tmpContainText = ContainText End If ' Patterns für ganzens Worte setzen (Wenn nur auf komplette Wörter geprüft werden soll) If bOnlyWholeWords = True Then tmpContainText = tmpContainText & "\b" If bIgnoreCase = True Then Return Regex.IsMatch(WholeText, tmpContainText, RegexOptions.IgnoreCase) Else Return Regex.IsMatch(WholeText, tmpContainText) End If End Functiony Private Sub txtSearchText_TextChanged(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles txtSearchText.TextChanged bTextFound = False ' Zurück setzen das Text gefunden wurde End Sub Private Sub combSearchColumn_SelectedIndexChanged(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles combSearchColumn.SelectedIndexChanged bTextFound = False ' Zurück setzen das Text gefunden wurde End Sub Private Sub chkNonCaseSensetive_CheckedChanged(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles chkNonCaseSensetive.CheckedChanged bTextFound = False ' Zurück setzen das Text gefunden wurde End Sub Private Sub chkOnlyWholeWord_CheckedChanged(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles chkOnlyWholeWord.CheckedChanged bTextFound = False ' Zurück setzen das Text gefunden wurde End Sub End Class Erläuterungen zum Code:
Weitere Funktion des „ListViewEx“:
1. ListViewEx verwenden 1.1 Control „ListViewEx“ in Ihr Projekt einbinden Darauf fügen Sie die DLL der Toolbox in Visual-Studio hinzu. 1.2 Aufruf des Suchdialogs Imports ListViewExtended
hinzu und verwenden folgende Zeilen (z.B. bei Key-Down Event von Strg+F), um den Suchdialog einzublenden: Dim ofrmFindInListView As frmFindInListView = New frmFindInListView ofrmFindInListView.Show(ListViewEx1, Me) Daraufhin erscheint der Suchdialog, der mit allen verfügbaren Spalten Ihres Listviews gefüllt ist. Download ListViewEx (115 KB) Dieser Workshop wurde bereits 16.027 mal aufgerufen.
Anzeige
Diesen und auch alle anderen Workshops 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. |
sevISDN 1.0 Überwachung aller eingehender Anrufe! Die DLL erkennt alle über die CAPI-Schnittstelle eingehenden Anrufe und teilt Ihnen sogar mit, aus welchem Ortsbereich der Anruf stammt. Weitere Highlights: Online-Rufident, Erkennung der Anrufbehandlung u.v.m. Tipp des Monats Januar 2025 Dieter Otter Zeilen einer MultiLine-TextBox ermitteln (VB.NET) Dieser Zipp zeigt, wie man die Zeilen einer MultiLine-TextBox exakt so ermitteln kann, wie diese auch in der TextBox dargestellt werden. sevGraph (VB/VBA) Grafische Auswertungen Präsentieren Sie Ihre Daten mit wenig Aufwand in grafischer Form. sevGraph unterstützt hierbei Balken-, Linien- und Stapel-Diagramme (Stacked Bars), sowie 2D- und 3D-Tortendiagramme und arbeitet vollständig datenbankunabhängig! |
|||||||||||||||||||||||||||||||||
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. |