Rechercher dans une listview

Signaler
Messages postés
134
Date d'inscription
jeudi 31 juillet 2008
Statut
Membre
Dernière intervention
15 février 2011
-
Messages postés
134
Date d'inscription
jeudi 31 juillet 2008
Statut
Membre
Dernière intervention
15 février 2011
-
Bonjour à tous,

J'ai des données qui sont dans une listview composées de 2 colonnes. Je souhaiterai faire une recherche dans la deuxième colonne de la listview (qui contient les mots clés) et afficher les résultats dans une lisbox.

Comment procéder pour réaliser cette recherche ?

Merci par avance pour votre aide,

8 réponses

Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
67
Salut
Catégorie Base de données + XML et tu nous parles de ListView : Bien choisi !

N'y aurait-il pas plusieurs méthodes Find dans les ListView sous vb.NET ?

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

<hr />Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
Messages postés
134
Date d'inscription
jeudi 31 juillet 2008
Statut
Membre
Dernière intervention
15 février 2011
1
J'ai mis ce bout de code mais j'ai toujours la même ligne qui s'affiche !

For Each ListViewItem In ListView1.Items
            Dim foundItem As ListViewItem = _
      ListView1.FindItemWithText(TextBox1.Text, True, 0, True)
            If foundItem IsNot Nothing Then
                ListBox2.Items.Add(foundItem.Text)
            End If
Next
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
67
Re
As-tu au moins regardé dans l'aide ?
Il est dit que FindItemWithText recherche le premier terme.
Pour chercher le suivant, il suffit de lui dire où recommencer.
Tout est expliqué dans l'aide, tu sais lire pourtant !

ListView1.Items.Add(

"toto 1")
ListView1.Items.Add(
"toto 2")
ListView1.Items.Add(
"marcel")
ListView1.Items.Add(
"toto 3")

Dim item1
As ListViewItem = ListView1.FindItemWithText(
"toto")

Do
While
Not item1
Is
Nothing
   Debug.Print(
"Trouvé " & item1.ToString)
   item1 = ListView1.FindItemWithText(
"toto",
False, item1.Index + 1)

Loop

Pourquoi fais-tu une énumération des items de ta ListView ?

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

<hr />Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
Messages postés
134
Date d'inscription
jeudi 31 juillet 2008
Statut
Membre
Dernière intervention
15 février 2011
1
Merci jack pour ton aide,

Je suis novice et je dois mal m'y prendre.
Ta solution me permet effectivement de faire des recherches mais si le mot recherché est le deuxième mot de la cellule, il ne le trouve pas.

Voici que je fais exactement :

1- Je charge un fichier excel
que je mets dans une listview
qui est masquée

La première colonne est composé du nom des fichiers pdf
La deuxième colonne est composé de mots clés (plusieurs par cellule)

  ' Création des colonnes pour les items et ses  subitems.
            ListView1.Columns.Add("nom du fichier", 130, HorizontalAlignment.Left)
            ListView1.Columns.Add("mots clés", 115, HorizontalAlignment.Left)
            '   Création de la listview avec les propriétés que vous voulez :
            ListView1.View = View.Details
            ListView1.LabelEdit = True
            ListView1.AllowColumnReorder = True
            'listview1.CheckBoxes = True
            ListView1.FullRowSelect = True
            ListView1.GridLines = True
            'listview1.Sorting = SortOrder.Ascending
            Dim MyConnection As System.Data.OleDb.OleDbConnection

            MyConnection = New System.Data.OleDb.OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Application.StartupPath + "\bd.xls;Extended Properties=Excel 8.0;")

            If Form1.Label1.Text = "2" Then
                Dim MyCommand As System.Data.OleDb.OleDbDataAdapter = New System.Data.OleDb.OleDbDataAdapter("select * from [baseco$]", MyConnection)
                Dim DS As System.Data.DataSet = New System.Data.DataSet
                MyCommand.Fill(DS)
                Dim TableExcel As DataTable
                TableExcel = DS.Tables(0)
                For i = 0 To TableExcel.Rows.Count - 1

                    ListView1.Items.Add(TableExcel.Rows(i).Item(0).ToString)
                    ListView1.Items(i).SubItems.Add(TableExcel.Rows(i).Item(1).ToString)
                Next   Création des colonnes pour les items et ses  subitems.
            ListView1.Columns.Add("nom du fichier", 130, HorizontalAlignment.Left)
            ListView1.Columns.Add("mots clés", 115, HorizontalAlignment.Left)
            '   Création de la listview avec les propriétés que vous voulez :
            ListView1.View = View.Details
            ListView1.LabelEdit = True
            ListView1.AllowColumnReorder = True
            'listview1.CheckBoxes = True
            ListView1.FullRowSelect = True
            ListView1.GridLines = True
            'listview1.Sorting = SortOrder.Ascending
            Dim MyConnection As System.Data.OleDb.OleDbConnection

            MyConnection = New System.Data.OleDb.OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Application.StartupPath + "\bd.xls;Extended Properties=Excel 8.0;")

            If Form1.Label1.Text = "2" Then
                Dim MyCommand As System.Data.OleDb.OleDbDataAdapter = New System.Data.OleDb.OleDbDataAdapter("select * from [baseco$]", MyConnection)
                Dim DS As System.Data.DataSet = New System.Data.DataSet
                MyCommand.Fill(DS)
                Dim TableExcel As DataTable
                TableExcel = DS.Tables(0)
                For i = 0 To TableExcel.Rows.Count - 1
                    ListView1.Items.Add(TableExcel.Rows(i).Item(0).ToString)
                    ListView1.Items(i).SubItems.Add(TableExcel.Rows(i).Item(1).ToString)
                Next
                MyConnection.Close()
            End If

2- Je mets les éléments de la première colonne de la listview dans une listbox visible et cliquable

          
            For x = 0 To ListView1.Items.Count - 1
                ListBox2.Items.Add(ListView1.Items(x).Text.ToString) '
                ListBox3.Items.Add(ListView1.Items(x).Text.ToString)
            Next

3- Pour faire les recherches à partir d'un textbox1

'moteur de recherche
ListBox2.Items.Clear()
        If TextBox1.Text <> "" Then
            Dim item1 As ListViewItem = ListView1.FindItemWithText(TextBox1.Text)
            Do While Not item1 Is Nothing
                ListBox2.Items.Add(item1.Text)
                If item1.Index < ListView1.Items.Count - 1 Then
                    item1 = ListView1.FindItemWithText(TextBox1.Text, True, item1.Index + 1)
                End If
            Loop
        Else
            For x = 0 To ListView1.Items.Count - 1
                ListBox2.Items.Add(ListView1.Items(x).Text.ToString)
            Next

        End If

Voici le détail de ce que je fais. S'il est possible de le faire plus simplement (facilement vu mes compétences ), je suis preneur.

Merci d'avance
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
67
Et as-tu essayé de faire précéder (et suivre ?) le mot que tu cherches par une étoile ?
   .FindItemWithText("*toto")

Peut-être que ça tombera en marche
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
67
Si tu mets True dans le FindItemWithText, il cherchera aussi dans les SubItems : C'est vraiment ce que tu veux ?
+ Il faut gérer l'Exception car, à un moment donné, Index + 1 dépassera la fin de la liste
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
67
Oups, j'avais pas vu le test de l'index de ListView1 : bien vu
Messages postés
134
Date d'inscription
jeudi 31 juillet 2008
Statut
Membre
Dernière intervention
15 février 2011
1
Merci pour ton aide jack,

J'ai abandonné le listview pour mettre les infos dans un listbox où la recherche fonctionne mieux :

Dim item As String
        For x = 0 To lsttotal.Items.Count - 1
            item = Lstmotcle.Items(x)
            If item.Contains(TextBox1.Text.ToLower) Then
                lstclicversion.Items.Add(lsttotalversion.Items(x))
                Lstclic.Items.Add(lsttotal.Items(x))          
            End If
        Next