Nach bestimmten Items in der Listbox suchen per Textbox.

  • VB.NET

Es gibt 12 Antworten in diesem Thema. Der letzte Beitrag () ist von Sekki.

    Nach bestimmten Items in der Listbox suchen per Textbox.

    Mein Code sieht so aus:

    Visual Basic-Quellcode

    1. ​Public Class Form1
    2. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    3. Dim OFD As New OpenFileDialog
    4. OFD.Multiselect = True
    5. OFD.Filter = "Image files (*.jpg, *.jpeg, *.jpe, *.jfif, *.png) | *.jpg; *.jpeg; *.jpe; *.jfif; *.png"
    6. If OFD.ShowDialog = Windows.Forms.DialogResult.OK Then
    7. For Each File As String In OFD.FileNames
    8. Dim F As New MyFile(File)
    9. ListBox1.Items.Add(F)
    10. Next
    11. End If
    12. End Sub
    13. Private Sub ListBox1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ListBox1.SelectedIndexChanged
    14. Try
    15. Dim SelectedFile As MyFile = DirectCast(ListBox1.SelectedItems(0), MyFile)
    16. PictureBox1.BackgroundImage = Image.FromFile(SelectedFile.FullName)
    17. Catch ex As Exception
    18. MsgBox(ex.Message)
    19. End Try
    20. ListBox1.HorizontalScrollbar = True 'scrollbar
    21. End Sub
    22. Private Sub TextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox1.TextChanged
    23. For x As Integer = 0 To ListBox1.Items.Count - 1
    24. If ListBox1.Items(x).ToString = TextBox1.Text$ Then
    25. ListBox1.SelectedIndex = x
    26. Return
    27. End If
    28. Next
    29. End Sub
    30. End Class
    31. Class MyFile
    32. Public Property FullName As String
    33. Public Property ShortName As String
    34. Public Overrides Function ToString() As String
    35. Return ShortName
    36. End Function
    37. Sub New(ByVal FilePath As String)
    38. Me.FullName = FilePath
    39. Me.ShortName = IO.Path.GetFileNameWithoutExtension(FilePath)
    40. End Sub
    41. End Class


    Aber gesucht wird nur der exakt eingegebene Text bzw Item. Wie krieg ich das hin, dass er nach 2..3 Anfangsbuchstaben , alle ähnlichen Ergebnisse in der Listbox anzeigt, in Echtzeit und ohne Button?
    Hi,

    könntest ja

    VB.NET-Quellcode

    1. If ListBox1.Items(x).ToString = TextBox1.Text$ Then


    durch

    VB.NET-Quellcode

    1. If ListBox1.Items(x).ToString.Contains(TextBox1.Substring(0, 3)) Then


    ersetzen. 3 steht für die ersten 3 Zeichen der TextBox.

    Lg


    Meine Website:
    www.renebischof.de

    Meine erste App (Android):
    PartyPalooza
    @xored: Nicht ganz. Der Ansatz ist richtig, aber das würde mit dem bestehenden Code dazu führen, dass der erste Treffer auch gleich selektiert wird.
    @preis09: Es gibt mehrere Möglichkeiten: Du könntest alle möglichen Treffer in einer 2. ListBox anzeigen lassen:

    VB.NET-Quellcode

    1. Private Sub TextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox1.TextChanged
    2. For Each Item In ListBox1.Items
    3. If Item.ToString.StartsWith(TextBox1.Text) Then ListBox2.Items.Add(Item)
    4. Next
    5. End Sub

    Alternativ: Alles MyFile-Objekte in einer List(Of MyFile) speichern, diese ggf. filtern und die Filterresultate in die ListBox1 schreiben.

    btw: ListBox1, TextBox1 und Co. sind von der Benennung ... ausbaufähig.
    Und: bitte die richtigen CodeTags verwenden. Du hast auf [VB6] geklickt -> "Visual Basic Code". Richtig ist aber der [VB.Net]-Button -> "VB.Net Code". Gugst Du hier
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @VaporiZed Naja, in der 2. Listbox wird das Ergebnis mehrfach ausgegeben und wenn ich auf das gesuchte Klicke, sollte das Image auf der Picturebox wiedergegeben werden.
    Die in der Listbox enthaltenen Items sind Fotos und keine Strings.

    Ichs sag mal so: Das Programm soll während des Schreibens schon die Ergebnisse anzeigen,
    sollte jedoch das Änhlichste rausfiltern bzw. beim Vervollständigen des Textes dann das exakte Ergebnis in der Listbox ausgeben bzw. übrig bleiben.

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „preis09“ ()

    also es geht in erster Linie nicht um eine Suche, sondern um einen Filter.
    Das ist etwas ungeschickt, Listbox hat eiglich keine Filterfunktion.
    Filter-Funktionalität steht bereit, wenn man mit Databinding arbeitet.
    Ansonsten musste Filterfunktionalität eben neu erfinden, hmm.
    Ich empfehle Databinding zu nutzen.
    Die 2. ListBox muss bei jedem TextBox_Changed geleert werden, stimmt.

    preis09 schrieb:

    Die in der Listbox enthaltenen Items sind Fotos und keine Strings.
    Nö. Post#1, Zeile#48, #49: Strings. In der Klasse MyFile ist keine Variable vom Typ Image oder Bitmap, nur Text. Also Strings. Steht ja auch da. Z#41, #42: Property ... As String.

    preis09 schrieb:

    Das Programm soll während des Schreibens schon die Ergebnisse anzeigen
    Meinst Du damit den Bildpfad (ein String!) in der ListBox oder mögliche Bilder in mehreren PicBoxen bzw. einem DGV? Bei ersterem geht das mit dem Code aus Post#3 plus ListBox leeren, wie hier im 1. Satz steht.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    @VaporiZed Meine Listbox ist voll mit Items, deren namen durch ein textbox herausgefiltert werden sollen. Es sind mehrere Bilder, sobald ich auf ein Item raufklick, stellt er mir das jeweilige Bild in der PicBox dar.

    @ErfinderDesRades Vielleicht ist Filter die falsche Bezeichnung, es soll das eingegebene suchen, ich hab Bilder mit Sätze als Namen.Wenn jetzt ein Bild "Ich stehe unter einer Wolke" oder "Ich gehe in die Disco" heisst, soll, wenn ich "Ich..." eintippe schon die Ergebnisse aufzeigen.Und wenn ich den exakten Namen eintippe, sollte auch der genaue Name in der ListBox angezeigt werden.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „preis09“ ()

    So fasse ich meine Posts zusammen, mache es noch durch Umgestaltung etwas schöner, erhalte

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private ReadOnly ListOfMyFiles As New List(Of MyFile)
    3. Private Sub FrmMain_Shown(sender As Object, e As EventArgs) Handles Me.Shown
    4. LoadAllPictures()
    5. ApplyFileFilter()
    6. End Sub
    7. Private Sub LoadAllPictures()
    8. Using OFD As New OpenFileDialog
    9. OFD.Multiselect = True
    10. OFD.Filter = "Image files (*.jpg, *.jpeg, *.jpe, *.jfif, *.png) | *.jpg; *.jpeg; *.jpe; *.jfif; *.png"
    11. If Not OFD.ShowDialog = Windows.Forms.DialogResult.OK Then Return
    12. For Each File As String In OFD.FileNames
    13. ListOfMyFiles.Add(New MyFile(File))
    14. Next
    15. End Using
    16. End Sub
    17. Private Sub ListBox1_SelectedIndexChanged(sender As Object, e As EventArgs) Handles ListBox1.SelectedIndexChanged
    18. If ListBox1.SelectedItems.Count = 0 Then Return
    19. PictureBox1.Image = Drawing.Image.FromFile(DirectCast(ListBox1.SelectedItems(0), MyFile).FullName)
    20. End Sub
    21. Private Sub TextBox1_TextChanged(sender As Object, ByVal e As EventArgs) Handles TextBox1.TextChanged
    22. ApplyFileFilter()
    23. End Sub
    24. Private Sub ApplyFileFilter()
    25. If Not ListOfMyFiles.Any Then Return
    26. Dim TargetFiles As IEnumerable(Of MyFile) = ListOfMyFiles
    27. If Not String.IsNullOrEmpty(TextBox1.Text) Then TargetFiles = ListOfMyFiles.Where(Function(x) x.ShortName.ToUpper.StartsWith(TextBox1.Text.ToUpper))
    28. ListBox1.Items.Clear()
    29. For Each File In TargetFiles
    30. ListBox1.Items.Add(File)
    31. Next
    32. End Sub
    33. End Class
    34. Class MyFile
    35. Public Property FullName As String
    36. Public Property ShortName As String
    37. Public Overrides Function ToString() As String
    38. Return ShortName
    39. End Function
    40. Sub New(ByVal FilePath As String)
    41. Me.FullName = FilePath
    42. Me.ShortName = IO.Path.GetFileNameWithoutExtension(FilePath)
    43. End Sub
    44. End Class

    und bin für das Erste zufrieden mit dem Ergebnis.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    preis09 schrieb:

    @ErfinderDesRades Vielleicht ist Filter die falsche Bezeichnung, es soll das eingegebene suchen, ich hab Bilder mit Sätze als Namen.Wenn jetzt ein Bild "Ich stehe unter einer Wolke" oder "Ich gehe in die Disco" heisst, soll, wenn ich "Ich..." eintippe schon die Ergebnisse aufzeigen.Und wenn ich den exakten Namen eintippe, sollte auch der genaue Name in der ListBox angezeigt werden.
    Das ist aber doch genau die Definition eines Filters, und ist genau, was Vaporized dir programmiert hat, und was bei Anwendung von Databinding auch bei rausgekommen wäre.

    C#-Quellcode

    1. ​For x As Integer = 0 To ListBox1.Items.Count - 1
    2. If ListBox1.Items(x).ToLower().Contains(TextBox1.Text.ToLower()) Then
    3. ListBox1.SelectedIndex = x
    4. Return
    5. End If
    6. Next


    Hiermit wird im Text gesucht und nicht nur am Anfang. Das heißt, wenn du vom Wort "HalloWelt" nur "ow" suchst, gibt er "HalloWelt" zurück. Markiere den noch als "Gelöst", damit auch jeder sofort weiß, dass hier keine Hilfe mehr benötigt wird. :)
    Wenn ich eine Frage stelle, habe ich sie bereits gegooglet. Ja, es kommt vor, dass ich die Antwort übersehe. Ja, es kommt vor, dass ich sie nicht verstehe. Deshalb bin ich hier. Wenn dies eure Frage war, dann antwortet bitte nicht. Es stiehlt sämtliche Motivation.