Listview suchen ?

  • VB.NET

Es gibt 18 Antworten in diesem Thema. Der letzte Beitrag () ist von kevin89.

    Listview suchen ?

    Ich weiß nicht wie ich das in Google umschreiben soll deswegen hab ich auch nicht viel gefunden. =)
    Naja, auf jeden Fall hab ich eine Listview. In dieser sind kurze Sätze gespeichert. Ich will jetzt versuchen diese zu suchen. Dh in dieser Listview steht iwo ein Satz wie zb. "Hallo ich bin der Peter" ^^ und ich suche dann nach "Peter" und der soll mir dann sagen in Item 123, 12, 8 und 100 befindet sich der Name Peter. :)

    VB.NET-Quellcode

    1. For Each i As String In ListView1.Items

    Wieso ist das ungültig? ist As String falsch?
    System.InvalidCastException wurde nicht behandelt.
    Message="Ungültige Konvertierung von Typ ListViewItem in Typ String."
    Source="Microsoft.VisualBasic"
    StackTrace:
    bei Microsoft.VisualBasic.CompilerServices.Conversions.ToString(Object Value)
    bei WindowsApplication1.Form1.Button23_Click(Object sender, EventArgs e) in C:\Dokumente und Einstellungen\Andy\Eigene Dateien\Visual Studio 2008\Projects\Winamp kontroll\Winamp kontroll\Form1.vb:Zeile 555.
    bei System.Windows.Forms.Control.OnClick(EventArgs e)
    bei System.Windows.Forms.Button.OnClick(EventArgs e)
    bei System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
    bei System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
    bei System.Windows.Forms.Control.WndProc(Message& m)
    bei System.Windows.Forms.ButtonBase.WndProc(Message& m)
    bei System.Windows.Forms.Button.WndProc(Message& m)
    bei System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
    bei System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
    bei System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
    bei System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
    bei System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(Int32 dwComponentID, Int32 reason, Int32 pvLoopData)
    bei System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
    bei System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
    bei System.Windows.Forms.Application.Run(ApplicationContext context)
    bei Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.OnRun()
    bei Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.DoApplicationModel()
    bei Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.Run(String[] commandLine)
    bei WindowsApplication1.My.MyApplication.Main(String[] Args) in 17d14f5c-a337-4978-8281-53493378c1071.vb:Zeile 81.
    bei System.AppDomain._nExecuteAssembly(Assembly assembly, String[] args)
    bei System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
    bei Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
    bei System.Threading.ThreadHelper.ThreadStart_Context(Object state)
    bei System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
    bei System.Threading.ThreadHelper.ThreadStart()
    InnerException:

    ne möglichkeit wäre:

    VB.NET-Quellcode

    1. Dim vitem As ListViewItem = ListView1.FindItemWithText(TextBox1.Text, True, 0)
    2. ListView1.Select()
    3. vitem.Selected = True
    4. ' True = SubItems werden mit gesucht
    5. '0 StartItem
    GOOGLE ist mein Meister :)
    Jupp
    die Dinger im Items Array der Listview sind vom Typ ListviewItem

    VB.NET-Quellcode

    1. for each lvi as Listviewitem in Listview1
    2. if lvi.SubItem(Spalte in der der Stringsteht).Text.Contains("Suchwort") then
    3. 'was auch immer passieren soll wenn das Gesuchte gefunden wird
    4. end if
    5. next


    grüße
    Phil

    Edit: Badys Lösung ist cooler, ich ziehe meinen hut :)
    ja aber es würde besser mit ner schleife klappen weil ich die restlichen items die mein Stichwort nicht enthalten löschen will. Und deine For Schleife hat einen Fehler. -.-
    For Each lvi As ListViewItem In ListView1 (...)

    Fehler 1 Der Ausdruck ist vom Typ "System.Windows.Forms.ListView" und ist keine Auflistung.
    ???
    Ahh ja ich hab mehrere Spalten. Kann es daran liegen?
    also Suchen:

    VB.NET-Quellcode

    1. Public Function Search(Wert As String) As Integer
    2. Dim f As Integer = 0
    3. For Each LVI As ListViewItem In ListView1.Items
    4. If LVI.Contains(Wert) Then f = LVI.Index : Exit For
    5. Next
    6. Return f
    7. End Function
    Das kotzt mich langsam an...
    Fehler 1 "Contains" ist kein Member von "System.Windows.Forms.ListViewItem".

    Ich habe gerade keine Zeit aber später schilder ich euch mal ganz ganz genau wie es bei mir aussieht und wo meine Probleme liegen. =) bis dann
    Probier mal das:

    VB.NET-Quellcode

    1. Function Searchitem(ByVal suchwort As String) As List(Of Integer)
    2. Dim l As New List(Of Integer)
    3. For Each item As ListViewItem In ListView1.Items
    4. If item.Text.Contains(suchwort) Then
    5. l.Add(item.Index)
    6. End If
    7. Next
    8. Return l
    9. End Function
    ja das klappt schon mal.
    Also ... Ich habe eine Listview (siehe Anhang). Dort sind halt Musikstücke aufgezählt mit Pfad und allem drum und dran. Nun ich möchte jetzt diese Liste durchsuchen lassen. Dh. Pfad, Artist, Song, Album usw. und der soll mir dann die Zeile ausgeben. Das Problem in dem Code von kevin89 ist, dass ich ganz genau auf die Groß- und Kleinschreibung achten muss und dass er nur die erste Spalte durchsucht. In diesem Fall den Pfad. Ich hoffe so kann man mir besser helfen :S
    Bilder
    • Pic_0067.jpg

      64,25 kB, 548×200, 504 mal angesehen
    Wie wär´s damit? Durchsucht auch alle Subitems und ignoriert Groß/Kleinschreibung:

    VB.NET-Quellcode

    1. Function Searchitem(ByVal suchwort As String) As List(Of Integer)
    2. Dim l As New List(Of Integer)
    3. For Each item As ListViewItem In ListView1.Items
    4. For Each subitem As ListViewItem.ListViewSubItem In item.SubItems
    5. If subitem.Text.ToLower.Contains(suchwort.ToLower) Then
    6. l.Add(item.Index)
    7. End If
    8. Next
    9. Next
    10. Return l
    11. End Function
    Sry, dass ich dieses alte Thema nochmal hervor grabe, aber ich habe hier alle Coes ausprobiert, aber es Funktioniert einfach nicht ... :(
    Ich habe auch eine ListView, mit 2 Spalten, aber die 2.Spalte ist unwichtig.
    Es soll nur in der 1. Spalte gesucht werden und wenn eine übereinstimmung gefunden wurde soll dieses Item ausgewählt werden.
    Wenn groß und kleinschreibung ignoriert wird ist es natürlich super, aber ich wäre auch schon mit einer Funktionierenden suche zufrieden :)
    Eigentlich will ich ja das betreffende Item dann auswählen, aber ich bekomme es nicht einaml hin, dass sich eine MessageBox öffnet.... :(

    Quellcode

    1. For Each lvi As ListViewItem In ListView1.Items
    2. If lvi.Text = TextBox1.Text Then
    3. MsgBox("Hallo")
    4. End If
    5. Next
    Was hältst du erstmal davon:

    VB.NET-Quellcode

    1. For Each lvi As ListViewItem In ListView1.Items
    2. Msgbox(lvi.Text) ' oder einfach debug.print
    3. If lvi.Text = TextBox1.Text Then
    4. MsgBox("Hallo")
    5. End If
    6. Next

    So, und dann vergleichst du die Ausgabe mal mit dem Text in der Textbox... SO geht man vor, wenn man nach einer Lösung sucht.
    Jetzt werden mir nach einander die MessageBoxen mit den Inhalten (ListView1) angezeigt.
    Blos irgendwie reagiert die If Schleife nicht darauf, auch wenn es genau der gleiche Name ist .... :(

    Edit:
    Sry, bin gestern wohl irgenwie auf den Schlauch gestenden, ich hab die Falsche Textbox angegeben :)

    Danke für eure Hilfe ;)
    Jetzt weiß ich zumindest fürs nächste mal wie ich richtig Fehler suche ;)
    Dann schlage ich erstmal folgendes vor:

    VB.NET-Quellcode

    1. For Each lvi As ListViewItem In ListView1.Items
    2. Msgbox(lvi.Text) ' oder einfach debug.print
    3. MsgBox(IIf(String.Compare(lvi.Text, TextBox1.Text), "keine übereinstimmung!", "übereinstimmung!"))
    4. If lvi.Text = TextBox1.Text Then
    5. MsgBox("Hallo")
    6. End If
    7. Next

    Und dann die Ausgabe abwarten ;)

    Edit: Ok :)