Trier une listbox

Moundir76 Messages postés 286 Date d'inscription dimanche 3 octobre 2010 Statut Membre Dernière intervention 16 mai 2014 - 24 janv. 2012 à 11:27
Moundir76 Messages postés 286 Date d'inscription dimanche 3 octobre 2010 Statut Membre Dernière intervention 16 mai 2014 - 24 janv. 2012 à 16:05
Bonjour,

J'ai une ListBox que je remplis par une BDD à l'aide d'une DateTable et d'un SqlDataAdapter et ainsi dans ma listbox j'ai un DisplayMember et un ValueMember.

Avec cette listbox j'obtiens donc tous les noms de ma BDD, mais j'aimerais créer des boutons pour que l'utilisateur puisse trier les noms et n'obtenir que ceux qu'il rechercher :

exemple : un Bouton [A=>E] et un bouton [F=>L] etc... qui va afficher que les noms selons le clic bouton. Mais je ne voit pas comment faire cela, est ce que je vais devoir faire une commande SQL pour chaque bouton pour remplir la listbox avec un DataAdapter ??? mais dans ce cas je ne vois pas, peut être une WHERE nom Like "A" Or Like "B" etccc

Soit trouver une solution qui permet de trier directement la listbox et donc plus optimisé, mais qui va gérer les valuemember.

J'espere avoir été clair et que quelqu'un pourra m'aider

Cordialement

10 réponses

Utilisateur anonyme
24 janv. 2012 à 12:02
Salut,

Pourquoi ne pas gérer l'évènement KeyPress?
Quand l'utilisateur appuie sur une lettre on fait défiler la listbox jusqu'à un item qui commence par cette lettre:

    Private Sub ListBox1_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles ListBox1.KeyPress
        ListBox1.Sorted = True
        For i As Integer = 0 To ListBox1.Items.Count - 1
            ListBox1.SetSelected(i, True)
            If ListBox1.SelectedItem.ToString.StartsWith(e.KeyChar) Then Exit For
        Next
    End Sub



Cordialement


CF2i - Guadeloupe
Ingénierie Informatique
0
Moundir76 Messages postés 286 Date d'inscription dimanche 3 octobre 2010 Statut Membre Dernière intervention 16 mai 2014
24 janv. 2012 à 12:14
Salut,

Pourquoi ne pas gérer l'évènement KeyPress? 


C'est parcequ'il n'y a pas de clavier, tout est en tactile

Merci pour ton code, mais des la premiere ligne je remarque que tu as mis :
ListBox1.Sorted = True
, cependant lorsque l'on fait ça, ça tri bien les displaymember mais pas les valuemember.... et on se retrouve avec des incohérences car si on clique sur Roger Rabbit (valuemember 1), on va obtenir un valuemember qui n'est pas le bon... du fait qu'ils ne sont pas triés en même temps.

Tu comprends ?
0
cs_Le Pivert Messages postés 7860 Date d'inscription jeudi 13 septembre 2007 Statut Contributeur Dernière intervention 2 décembre 2022 135
24 janv. 2012 à 12:28
Bonjour,
Dans un de mes programmes pour chercher une extension dans une longue liste. J'avais mis cela dans un button avec un textBox pour la recherche:

 Try
            y = txtSearch.Text
            x = ListBox1.FindString(y)
            'retourne le numéro du premier élément commençant par "x".
            ListBox1.SetSelected(x, True) 'la ligne contenant x devient bleue
        Catch
            ' l'ajout d'un try/catch permet d'éviter les plantages avec les extensions inexistantes
            MessageBox.Show("Extension non valide!", "Recherche extension", MessageBoxButtons.OK, MessageBoxIcon.Information)
            Exit Sub
        End Try


Si cela peut t'aider
@+Le Pivert
0
Utilisateur anonyme
24 janv. 2012 à 12:46
Pas de clavier! je ne pouvais pas le savoir...

displaymember mais pas les valuemember

C'est normal, c'est un tri par ordre alphabétique si tu as des valeurs numériques il va d'abord afficher tous les "1", "10", "1000" etc en suite les "2", "200", "20000" etc.

Mais dans ton cas c'est vraiment avec des boutons (comme tu dis) qu'il faut gérer le tri.

x = ListBox1.FindString(y)

La méthode de Pivert est pas mal, je fais un test...

Cordialement


CF2i - Guadeloupe
Ingénierie Informatique
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_ShayW Messages postés 3258 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 3 décembre 2019 55
24 janv. 2012 à 14:02
Salut

Avec cette listbox j'obtiens donc tous les noms de ma BDD, mais j'aimerais créer des boutons pour que l'utilisateur puisse trier les noms et n'obtenir que ceux qu'il rechercher


quel rapport avec la listbox ?
ta liste est le résultat d'une requette
peut on trier logiquement le résultat ?
explique ce que doit faire ta requette ?
0
Moundir76 Messages postés 286 Date d'inscription dimanche 3 octobre 2010 Statut Membre Dernière intervention 16 mai 2014
24 janv. 2012 à 14:08
Merci à tous les deux pour vos réponses.

Le Pivert merci pour ton code, ce n'est pas du tout ce que je souhaite faire mais si jamais je ne trouve pas de solutions ça peut dépanner
0
Utilisateur anonyme
24 janv. 2012 à 14:52
Re:

Je pense avoir compris (au moins une partie):
Public Class Form1
    Dim Bouton(4) As Button
    Dim Liste As ListBox

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        'pour le test:
        ListBox1.Items.Add("alkjlkj")
        ListBox1.Items.Add("boiuoiu")
        ListBox1.Items.Add("cytrurt")
        ListBox1.Items.Add("diyoiuy")
        ListBox1.Items.Add("ehfuyiy")
        ListBox1.Items.Add("fknknpn")
        ListBox1.Items.Add("gokjpojopi")
        ListBox1.Items.Add("hezareza")
        ListBox1.Items.Add("ihbihbkj")
        ListBox1.Items.Add("abvcnc")
        ListBox1.Items.Add("btreytre")
        ListBox1.Items.Add("ckpnpl")
        ListBox1.Items.Add("dezaeza")
        ListBox1.Items.Add("ejnojini")
        ListBox1.Items.Add("feztretre")
        ListBox1.Items.Add("gytreyte")
        ListBox1.Items.Add("hezare")
        ListBox1.Items.Add("idwgw")
        For Rt As Integer = 0 To 3
            Bouton(Rt) = New Button
            Bouton(Rt).Top = Rt * Bouton(0).Height
            If Rt 0 Then Bouton(Rt).Text "all"
            If Rt 1 Then Bouton(Rt).Text "abc"
            If Rt 2 Then Bouton(Rt).Text "def"
            If Rt 3 Then Bouton(Rt).Text "ghi"
            Me.Controls.Add(Bouton(Rt))
            AddHandler Bouton(Rt).Click, AddressOf Bouton_Click
        Next
        Liste = New ListBox
        Liste.Items.AddRange(ListBox1.Items)
    End Sub

    Private Sub Bouton_Click(ByVal Sender As Object, ByVal e As System.EventArgs)
        Dim St As String = Sender.Text
        If St = "all" Then
            ListBox1.Items.Clear()
            ListBox1.Items.AddRange(Liste.Items)
        Else
            ListBox1.Items.Clear()
            For i As Integer = 0 To Liste.Items.Count - 1
                For Each Caract As Char In St
                    If Liste.Items(i).ToString.StartsWith(Caract) Then ListBox1.Items.Add(Liste.Items(i))
                Next Caract
            Next i
        End If
        ListBox1.Sorted = True
    End Sub
End Class



Cordialement


CF2i - Guadeloupe
Ingénierie Informatique
0
Moundir76 Messages postés 286 Date d'inscription dimanche 3 octobre 2010 Statut Membre Dernière intervention 16 mai 2014
24 janv. 2012 à 15:30
Cette solution est géniale mais je ne pense pas que l'on peut gérer les valuemembers .... ou tout du moins je ne sais pas comment m'y prendre.

Mais sinon c'est exactement ce que je recherche merci acive
0
Utilisateur anonyme
24 janv. 2012 à 15:51
Ok,
On a déjà le tri alphabétique, maintenant on va réfléchir au tri numérique

Cordialement


CF2i - Guadeloupe
Ingénierie Informatique
0
Moundir76 Messages postés 286 Date d'inscription dimanche 3 octobre 2010 Statut Membre Dernière intervention 16 mai 2014
24 janv. 2012 à 16:05
On a déjà le tri alphabétique, maintenant on va réfléchir au tri numérique


Mais je ne pense pas que ce soit un tri numérique, puisque c'est un valuemember qui est associé a un id. par exemple :

VALUEMEMBER  | DISPLAYMEMBER
17           | Dupont 
569          | Valin
40           | Boubet



Donc chaque displaymember a son valuemember associé et les deux ne doivent pas être dissociés. D'ou le problème ^^

Merci de ton aide
0