Controle voor alle items in listbox

Status
Niet open voor verdere reacties.

Luuknl

Terugkerende gebruiker
Lid geworden
29 jan 2010
Berichten
1.193
Beste mensen,

Ik wil een zoekfunctie maken in mijn programma. Ik wil dat er voor elk item in de listbox word gecontroleerd of het de tekst van textbox1 bevat.
Wat ik zelf even probeerde is dit:
Code:
Public Class Form1

    Private Sub TextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox1.TextChanged
        For Each item In ListBox1.Items
            If ListBox1.Items.Contains(TextBox1.Text) Then

            End If
        Next

    End Sub
End Class

Maar dat klopt al niet...
Ik werk trouwens in visual basic ;)

Weet iemand hoe die mij opweg kan helpen?

Groet
 
Laatst bewerkt:
[CPP] For Each item In ListBox1.Items
If Item.Contains(TextBox1.Text) Then

End If
Next
[/CPP]

:)
 
BEdankt, ik ga het morgen proberen ;)
 
Het kan ook zo, zonder een For Each lus:

Code:
If ListBox1.Items.Contains(TextBox1.Text) Then
...
End If
 
@TheMightyAtom: Maar dan heb je niet het object van het Item waar die tekst in staat.
 
Ok beide manieren werken maar ik ga verder met de manier van JoZ1.
Nu het volgende:
Eerst staan er een aantal items in de listbox zoals dit:
Code:
Item 1
Item 2
Item 3

Maar ik wil dat als je nu iets in het textvak typt, dat dan alleen de items worden weergegeven waarvan de tekst de tekst van tekstbox1 bevat. En dat de rest dus weg is. Dus als ik bijvoorbeeld typ: Item 1
Dat dan alleen item 1 zichtbaar is en de rest niet...
Ik kon niet iets vinden om per item .visible = false of true te doen. En dat zal ook wel niet kloppen.
 
[CPP]Dim Items As New List(Of String)
For Each item In ListBox1.Items
If Not item.Contains(TextBox1.Text) Then
Items.Add(item)
End If
Next
For Each item In Items
ListBox1.Items.Remove(item)
Next[/CPP]

Misschien een beetje omslachtig, maar toch :).
 
Ok dat werkt wel, maar als ik nu typ: item 1 dan geeft hij item 1 weer.
Als ik daarna de 1 vervang door een 2 werkt het niet meer...
 
O! Dat komt omdat ik alles wat niet overeenkwam liet verwijderen.

Hier een ander voorbeeld:


[CPP]Dim Items As New List(Of String)
Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
For Each item In ListBox1.Items
Items.Add(item)
Next
End Sub

Private Sub TextBox1_TextChanged(sender As System.Object, e As System.EventArgs) Handles TextBox1.TextChanged
ListBox1.Items.Clear()
For Each item In Items
If item.Contains(TextBox1.Text) Then ListBox1.Items.Add(item) Else ListBox1.Items.Remove(item)
Next
End Sub[/CPP]

9n3Us.gif


:)
 
Laatst bewerkt:
Zou je zoiets ook kunnen maken maar dan voor een ListView en dat je kan filteren op zowel items als subitems?
 
Laatst bewerkt:
En de items die niet aan de criteria voldoen moeten gewoon niet zichtbaar worden?

In dit voorbeeld:

knipselbe.jpg


Als op 'Janssen' wordt gezocht, mogen 'Piet' en 'Bloemstraat 1' dan niet zichtbaar zijn?
 
Nee die moeten zichtbaar blijven omdat ze deel uitmaken van hetzelfde ListViewItem object. Alle andere items moet onzichtbaar worden.
 
[CPP] Dim Items As New List(Of ListViewItem)

Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
For Each item In ListView1.Items
Items.Add(item)
Next
End Sub

Private Sub TextBox1_TextChanged(sender As System.Object, e As System.EventArgs) Handles TextBox1.TextChanged
ListView1.Items.Clear()
For Each item In Items
If item.Text.Contains(TextBox1.Text) Then
ListView1.Items.Add(item)
Else
If item.SubItems(1).Text.Contains(TextBox1.Text) Then
ListView1.Items.Add(item)
Else
If item.SubItems(2).Text.Contains(TextBox1.Text) Then
ListView1.Items.Add(item)
End If
End If
End If
Next
End Sub[/CPP]

4b54s.gif


Voìla :)
 
@JoZ1, waarom zo moeilijk doen met al die if/else if etc? Gewoon 'Or' gebruiken!

PHP:
Public Class Form1
    Private Personen As New List(Of ListViewItem)

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        ListView1.Items.Add(New ListViewItem(New String() {"Henk", "Janssen", "Ver weg"}))
        ListView1.Items.Add(New ListViewItem(New String() {"Brian", "Kaarte", "Dichtbij"}))
        ListView1.Items.Add(New ListViewItem(New String() {"Mike", "Wichern", "Amsterdam"}))
        For Each item As ListViewItem In ListView1.Items
            Personen.Add(item)
        Next
    End Sub

    Private Sub TextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox1.TextChanged
        ListView1.Items.Clear()
        For Each item As ListViewItem In Personen
            If item.Text.Contains(TextBox1.Text) Or item.SubItems(1).Text.Contains(TextBox1.Text) Or _
            item.SubItems(2).Text.Contains(TextBox1.Text) Then ListView1.Items.Add(item)
        Next
    End Sub
End Class
 
Deze is precies goed.
9n3Us.gif
Ga ik gebruiken. Bedankt!;):D
 
En wat als ListViewItem object ook een value in hun Tag property hebben? Die moet wel bewaard blijven.
 
@Luuknl: Goedzo! :thumb: Wil je de vraag dan op 'Opgelost' zetten?

@TheMightyAtom: Die blijven volgens mij bewaard, omdat je een List (Of ListViewItem) gebruikt ;).

@CaptainBri: Inderdaad! :thumb: Had ik nog niet aan gedacht. :o
 
@JoZ1, kan je mij nog uitleggen wat de code precies per regel betekent? Ik begrijp het namelijk niet helemaal en om het te onthouden begrijp ik het liever wel :)

Had ik niet al gezegd dat hij eigenlijk nog niet helemaal werkt? Als ik namelijk als items heb: Item 1, Item 2, Item 3. En dan typ ik in: Item 1 en daarna haal ik de 1 weg en vervang die door een 2, dan worden er geen items weergegeven.
 
Laatst bewerkt:
Natuurlijk :).

[CPP]Private Personen As New List(Of ListViewItem)[/CPP]

Hier wordt de lijst gedeclareerd waar alle items worden opgeslagen zodat ze later terug kunnen worden gehaald.

Form.Load Event

[CPP]For Each item As ListViewItem In ListView1.Items
Personen.Add(item)
Next[/CPP]

En hier worden die items er dus in gestopt.

TextBox1.TextChanged Event


[CPP] ListView1.Items.Clear()[/CPP]

Hier wordt de ListView geleegd, omdat anders de items niet verdwijnen als ze niet aan de criteria voldoen.

[CPP] For Each item As ListViewItem In Personen
If item.Text.Contains(TextBox1.Text) Or item.SubItems(1).Text.Contains(TextBox1.Text) Or _
item.SubItems(2).Text.Contains(TextBox1.Text) Then ListView1.Items.Add(item)
Next[/CPP]

Hier wordt gezegd: Voor elk item dat opgeslagen is: Als het item zelf (of één van zijn SubItems) TextBox1.Text bevat, wordt het toegevoegd (en blijft het dus staan).

:)

Had ik niet al gezegd dat hij eigenlijk nog niet helemaal werkt? Als ik namelijk als items heb: Item 1, Item 2, Item 3. En dan typ ik in: Item 1 en daarna haal ik de 1 weg en vervang die door een 2, dan worden er geen items weergegeven.

Huh? Met een ListView? Mag ik je code dan even zien?
 
Laatst bewerkt:
Dit is de code:
Code:
Public Class Form1

    Dim ItemLijst As New List(Of ListViewItem)

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        For Each item As ListViewItem In ListBox1.Items
            ItemLijst.Add(item)
        Next
    End Sub

    Private Sub TextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox1.TextChanged
        ListBox1.Items.Clear()
        For Each item As ListViewItem In ItemLijst
            If item.Text.Contains(TextBox1.Text) Then
                ListBox1.Items.Add(item)
            End If
        Next
    End Sub
End Class

Ik gebruik dus een listbox (listbox1) en een tekstvak (textbox1).
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan