Classement des items dans une listbox

Résolu
bigou87 Messages postés 32 Date d'inscription dimanche 20 janvier 2008 Statut Membre Dernière intervention 15 janvier 2009 - 29 déc. 2008 à 15:42
bigou87 Messages postés 32 Date d'inscription dimanche 20 janvier 2008 Statut Membre Dernière intervention 15 janvier 2009 - 30 déc. 2008 à 10:44
Tout d'abord bonjour à tous !

Voilà mon problème :

Je liste dans une listbox le nom de tous les fichiers excel contenus dans un dossier ( jusque là aucuns problèmes ). TOUT les noms de ces fichiers sont de la forme :   xxx1236xxx    Le nombre de caractères de chaque cotés du nombre changent , le nombre du milieu aussi , et les caracteres changent aussi ! Tous ces fichiers sont de types .xls et sont affichés dans la listbox sans leur extension.

Se que je voudrais :

Mes noms de fichiers sont actuellements classés par ordre alphabétique mais je voudrait qu'ils soient classés par ordre croissant selon le nombre du milieu ! Et c'est là que je bloque !

Si quelqun pouvait m'éclairer !
BIGU87

13 réponses

cs_fauve Messages postés 661 Date d'inscription vendredi 2 décembre 2005 Statut Membre Dernière intervention 23 mars 2011 8
29 déc. 2008 à 19:12
Salut,

Voici une fonction que j'avais crée il y a quelque temps pour quelqu'un qui cherchait à faire la même chose que toi :


Note : Il faut passer ta ListBox en paramètre dans la fonction






<hr size= "2" width="100%" />







Sub
 TriListBox(ByRef LstBox As ListBox)
     Dim TriLstBox As New Collections.Generic.List(Of String)

     For nb As Integer  = 0 To LstBox.Items.Count - 1
          Dim str As String =   ""

           For Each  Car As Char In LstBox.Items(nb)
               If IsNumeric(Car) Then
                    str + = Car
               End If
          Next
          TriLstBox.Add(str)
     Next

     For i As Integer =   0  To TriLstBox.Count - 1
          For j As Integer  = 0 To TriLstBox.Count - 1
               If TriLstBox.Item(i) < TriLstBox.Item(j) Then
                    Dim Temp1Str As String =  TriLstBox.Item(j)
                     Dim  Temp2Str As String  = LstBox.Items(j)

                    TriLstBox.Item(j) =  TriLstBox.Item(i)
                    TriLstBox.Item(i) = Temp1Str

                    LstBox.Items(j) = LstBox.Items(i)
                    LstBox.Items(i) = Temp2Str
                End If
          Next
     Next

End Sub







<hr size ="2" width="100%" />
++

Fauve

<hr size="2" width="100%" />
Pensez : Réponse Acceptée 
3
bigou87 Messages postés 32 Date d'inscription dimanche 20 janvier 2008 Statut Membre Dernière intervention 15 janvier 2009
29 déc. 2008 à 19:54
J'ai fini par trouver c'était très simple finalement ! Voila le code :

Sub  TriListBox(ByRef LstBox As ListBox)
     Dim TriLstBox As New Collections.Generic.List(Of String)

     For nb As Integer =  0 To LstBox.Items.Count - 1
          Dim str As String =  ""

          For Each Car As Char In LstBox.Items(nb)
               If IsNumeric(Car) Then
                    str + = Car
               End If
          Next
          TriLstBox.Add(str)
     Next

     For i As Integer = 0 To TriLstBox.Count - 1
          For j As Integer = 0 To TriLstBox.Count - 1
               If TriLstBox.Item(i) > TriLstBox.Item(j) Then
                    Dim Temp1Str As String  = TriLstBox.Item(j)
                    Dim Temp2Str As String = LstBox.Items(j)

                    TriLstBox.Item(j) = TriLstBox.Item(i)
                    TriLstBox.Item(i) = Temp1Str

                    LstBox.Items(j) = LstBox.Items(i)
                    LstBox.Items(i) = Temp2Str
               End If
          Next
     Next

End Sub

J'ai juste remplacé le signe < par >
3
bigou87 Messages postés 32 Date d'inscription dimanche 20 janvier 2008 Statut Membre Dernière intervention 15 janvier 2009
30 déc. 2008 à 10:29
Finalement j'ai résolu mon problème autrement , merci encore à tous !
BIGU87
3
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
29 déc. 2008 à 18:08
Salut
L'idée que j'aurai serait d'utiliser une ListView (invisible) pour faire le tri avant l'insertion dans la ListBox.
La ListView a une propriété Tag associée à chaque item.
Cette propriété ne sert à rien, sauf à pouvoir stocker des données internes à la prog.

-1- Lister les noms fichiers - début de boucle
-2- Pour chaque fichier, isoler le nombre coincé au milieu du nom (une boucle est simple à réaliser)
-3- Insérer dans la ListView :
      Dans le Texte : Le nombre trouvé
      Dans le Tag : Le nom complet du fichier
-4- Continuer avec le fichier suivant, en -2-
-5- Demander à la LstView d'effectuer le tri  ascendant
      Nous avons dans la ListView tous les items triés par le numéro
-6- Transférer chaque item de la ListView vers la ListBox - Boucle
      En commençant du permier au dernier, il suffit de relire le Tag de l'item pour l'insérer dans la ListBox
-7- Vider la ListView

Bien sûr, il ne faudra surtout pas demander à la ListBox de refaire un tri ensuite, sinon le tri sera à nouveau fait sur le nom du fichier

Il y a peut-être des solutions plus élégantes ...

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)
0

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

Posez votre question
bigou87 Messages postés 32 Date d'inscription dimanche 20 janvier 2008 Statut Membre Dernière intervention 15 janvier 2009
29 déc. 2008 à 18:17
Merci d'avoir répondu ! Étant nouveau dans le monde de la programmation je ne dompte pas encore bien la bête mais je te promet d'essayer , je vois ce que tu veux dire mais j'ai encore quelques difficultés avec les boucles et tout
Je te tient au courant ! Merci encore

BIGU87
0
bigou87 Messages postés 32 Date d'inscription dimanche 20 janvier 2008 Statut Membre Dernière intervention 15 janvier 2009
29 déc. 2008 à 18:56
Premier problème ^^ Voila le début de mon code : 

 Sub test(ByVal dir As String)
        Dim listFile(), fichier As Object
        listFile = Directory.GetFiles(dir)
        If listFile.Length <> 0 Then
            For Each fichier In listFile
                Dim file As New FileInfo(fichier)
                refreshFichier += 1
                If refreshFichier = 100 Then
                    ListView1.Update()
                    refreshFichier = 0
                End If
                Dim num = Mid(file.Name, 6, 9)
                Dim nom = file.Name
                ListView1.Items.Add(num)
                ListView1.Items.Item(num).Tag = nom
            Next
            ListView1.Sorting = SortOrder.Ascending
            ListView1.Sort()
        End If

    End Sub

Mais une erreur se déclare a la ligne ici en rouge :

"La référence d'objet n'est pas définie à une instance d'un objet." avec comme con "Utilisez le mot clé new pour créer une instance d'objet"
 
Je ne comprends pas trop ce que l'on me demande !

BIGU87
0
bigou87 Messages postés 32 Date d'inscription dimanche 20 janvier 2008 Statut Membre Dernière intervention 15 janvier 2009
29 déc. 2008 à 18:58
Désolé j'ai oublié de finir d'écrire le mot "conseil" je savais pas où j'avais la tête !
0
bigou87 Messages postés 32 Date d'inscription dimanche 20 janvier 2008 Statut Membre Dernière intervention 15 janvier 2009
29 déc. 2008 à 19:42
Merci ! Je n'y comprend absolument rien mais cela fonctionne apparemment ! Peut être que je comprendrai plus tard en continuant de m'exercer

BIGU87
0
bigou87 Messages postés 32 Date d'inscription dimanche 20 janvier 2008 Statut Membre Dernière intervention 15 janvier 2009
29 déc. 2008 à 19:47
Je viens de trouver un petit hic et je ne sais pas du tout où faire la modification étant donné que je ne comprends pas le code ^^ ! Il me classe les fichiers comme j'ai demandé mais dans l'ordre croissant alors que je préférerais dans l'ordre décroissant. Si tu pouvais me dire où faire la modification ce serait sympa !

BIGU87
0
bigou87 Messages postés 32 Date d'inscription dimanche 20 janvier 2008 Statut Membre Dernière intervention 15 janvier 2009
29 déc. 2008 à 19:55
Merci à  tous pour votre précieuse aide !
0
cs_fauve Messages postés 661 Date d'inscription vendredi 2 décembre 2005 Statut Membre Dernière intervention 23 mars 2011 8
29 déc. 2008 à 20:14
Ah oui, la personne a qui je l'ai fait voulait la même chose que toi mais en triant par ordre croissant mais pour faire de manière décroissante c'est très simple, tu as même trouvé ce qui faut changé

++

Fauve

<hr size="2" width="100%" />
Pensez : Réponse Acceptée 
0
bigou87 Messages postés 32 Date d'inscription dimanche 20 janvier 2008 Statut Membre Dernière intervention 15 janvier 2009
29 déc. 2008 à 20:16
Maintenant j'ai un autre problème !  Mes fichiers sont dans la listbox, et j'aimerai que  l'on puisse rentrer dans une textbox le numéro d'un de ces fichiers et que en cliquant sur un bouton "RECHERCHER"  l'item contenant le nombre soit sélectionné ! Ce qui me fait barage c'est les caratères qui précedent le nombre du nom du fichier a rechercher !

Pour le moment j'ai ce code que j'ai fait mais je n'arrive pas à le modifier :

        Dim x As Integer
        Dim cherch
        cherch =  TextBox1.Text
        x = ListBox2.FindString(cherch, 0)
        ListBox2.SetSelected(x, True)
        Dim sel
        sel = ListBox2.SelectedItem
        ListBox1.Items.Add(sel)
        ListBox1.SelectedItem = sel

BIGU87
0
bigou87 Messages postés 32 Date d'inscription dimanche 20 janvier 2008 Statut Membre Dernière intervention 15 janvier 2009
30 déc. 2008 à 10:44
Je viens de me rendre compte que mon problème a attiré du monde ^^ presque 110 visites en moins d'un jour !
0
Rejoignez-nous