Insertion d'une ligne dans une listbox

Signaler
Messages postés
64
Date d'inscription
jeudi 4 mars 2010
Statut
Membre
Dernière intervention
17 juin 2010
-
Messages postés
1172
Date d'inscription
jeudi 24 mai 2007
Statut
Membre
Dernière intervention
28 septembre 2013
-
Bonjour,
j'ai un problème. Je souhaiterais ajouter une ligne dans une listbox (déjà remplie). J'arrive à ajouter une ligne à la fin de la liste (position par défaut je présume) mais je voudrais l'insérer à une ligne donnée.
Je m'explique : ma listbox est formée de 4 colonnes correspondant aux coordonnées X,Y,Z et t (temps) de plusieurs points. J'ajoute alors une ligne en précisant ces 4 paramètres. Mais je n'arrive pas à la faire s'insérer où je veux : je veux qu'elle s'insère en fonction de la valeur de t.
Par exemple si mon nouveau point a t=38500 je voudrais qu'il s'insère à la ligne suivant t=38499 et précédent t=38505 (par exemple).

Pour l'instant j'ai écris ce qui suit mais je suis perdu, j'arrive pas à avancer :

t = Val(Txtb_t.Text)

Dim i, j As Integer
j = Liste.Lstb_pts.ListCount

For i = 1 To j

??????

Liste.Lstb_pts.AddItem (Val(Txtb_x.Text))
Liste.Lstb_pts.List(Liste.Lstb_pts.ListCount - 1, 1) = Val(Txtb_y.Text)
Liste.Lstb_pts.List(Liste.Lstb_pts.ListCount - 1, 2) = Val(Txtb_z.Text)
Liste.Lstb_pts.List(Liste.Lstb_pts.ListCount - 1, 3) = Val(Txtb_t.Text)

Next

Merci pour votre précieuse aide qui me permettra d'avance !

12 réponses

Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
74
Salut
Ne peux-tu demander à ta ListBox de trier elle-même les items (.Sorted) ?

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

Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
Messages postés
64
Date d'inscription
jeudi 4 mars 2010
Statut
Membre
Dernière intervention
17 juin 2010

Salut jack,
je suis plutôt débutant et je ne saisis pas trop le sens de ta réponse.
Mes points sont déjà triés par t croissant, il faut juste que j'insère mon nouveau point à la bonne place. Merci de votre aide
Messages postés
64
Date d'inscription
jeudi 4 mars 2010
Statut
Membre
Dernière intervention
17 juin 2010

En fait, étant débutant, je n'arrive pas à écrire le code qui permet de récupérer le numéro de la ligne où mon nouveau point doit s'insérer. Donc si quelqu'un peut m'aider à écrire cette boucle, ce serait sympa.
Merci d'avance
Messages postés
1172
Date d'inscription
jeudi 24 mai 2007
Statut
Membre
Dernière intervention
28 septembre 2013
1
Comme tu dois trier par t la ligne sera placé automatiquement la où il faut !
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
74
Dans les ListBox, il n'y a pas d'index atitré, les items ont l'index correspondant à leur position, donc, dépendent du tri éventuel.
Comme tu l'auras vu dans l'aide de la méthode .AddItem, tu peux préciser un Index lors de l'insertion, mais cet index n'a plus d'intérêt en cas de tri.
Seuls les ListView permettent d'associer une Key (clé de recherche unique) et un véritable Index.

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

Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
Messages postés
64
Date d'inscription
jeudi 4 mars 2010
Statut
Membre
Dernière intervention
17 juin 2010

Merci Jack pour l'intéret que tu porte à ma demande. En fait, la liste de points importée dans la listbox est déjà classée par t croissant, aucun tri ne se fait dans mon programme.
J'avais alors pensé parcourir la liste avec un while en disant tant que t à insérer > aux t de la liste on continue de parcourir la liste et dès que t à insérer devient < aux t de la liste ; on retient la position.
Mais j'arrive pas à traduire ceci en ligne de code, même si je pense que c'est pas trop compliqué.
Pour le point que j'insère, je donne ces valeurs par :
Txtb_x
Txtb_y
Txtb_z
Txtb_t

Ma listbox est Liste.Lstb_pts.

Merci d'avance si qq'un peut m'aider.
Messages postés
1172
Date d'inscription
jeudi 24 mai 2007
Statut
Membre
Dernière intervention
28 septembre 2013
1
salut, quesque tu veux faire exactement avec cette listbox ?
Messages postés
64
Date d'inscription
jeudi 4 mars 2010
Statut
Membre
Dernière intervention
17 juin 2010

En fait j'ai une liste de coordonnées de points classés dans l'ordre croissant selon le temps (en secondes). Il y a donc 4 colonnes dans ma liste : X, Y, Z, temps. J'aimerais alors pouvoir insérer un nouveau point au bon endroit dans la liste en fonction de son temps. Donc il faut que je réussisse à écrire une boucle qui récupère le numéro de la ligne où le point devra s'insérer.
Merci de votre aide.
Messages postés
1172
Date d'inscription
jeudi 24 mai 2007
Statut
Membre
Dernière intervention
28 septembre 2013
1
nan mais que veux tu faire avec cette listbox aprés ?
Car pour moi c'est une visu, tes points doivent être dans une classe ou une listof(double) par exemple et c'est là qu'il faut ajouter ta nouvelle ligne de points, aprés la listview sera rechargé ou mise à jour avec le trie qui va bien.
Qu'en penses tu ?
++
Messages postés
64
Date d'inscription
jeudi 4 mars 2010
Statut
Membre
Dernière intervention
17 juin 2010

Bonjour,
Je suis d'accord Adn56. Mais étant débutant, je commence par ce qu'il me semble le plus simple pour me familiariser avec le code. Donc pour l'instant, j'arrive à exporter ma listbox mais après j'essaierai de procéder à peu près comme tu me le dit ; en gérant une base de données.
Messages postés
1172
Date d'inscription
jeudi 24 mai 2007
Statut
Membre
Dernière intervention
28 septembre 2013
1
voici un exemple de classe pour stocker tes infos :

public class Ligne_points
public X, Y, Z as double
public T as date
end class

utilisation :
Dim liste_de_lignes as new list(of Ligne_points)
aprés tu as accés à Add, Remove, clear, item pour gérer la list de point

La listbox, elle, ne fera qu'afficher liste_de_lignes

voila pour l'idée.
Messages postés
1172
Date d'inscription
jeudi 24 mai 2007
Statut
Membre
Dernière intervention
28 septembre 2013
1
Option Strict On
Imports System
Imports System.IO
Imports System.Runtime.Serialization.Formatters.Binary
Imports System.Collections.Generic

<Serializable()> Public Class cls_table
    Public lignes As New List(Of cls_ligne)
    
    '----------------------------------------------------------------------
    ' Sub qui sérialise et trie la class Class puis l'enregistre en binaire dans le fichier passé en paramétre
    '----------------------------------------------------------------------
    Public Sub save(ByVal fichier As String)
        If fichier = String.Empty Then Exit Sub 'quit la sub si aucun fichier ouvert avant la fermeture.
        Dim myFileStream As Stream = Nothing

        Try
            myFileStream = File.Create(fichier) ' création d'un nouveau fichier à chaque sauvegarde
            Dim serializer As New BinaryFormatter
            serializer.Serialize(myFileStream, Me)
            myFileStream.Close()

        Catch e As DirectoryNotFoundException

            Affiche_erreur("Répertoire introuvable, vérifier la présence du disque amovible si vous en utilisez un", e.Message)

        Catch e As FileNotFoundException ' n'arrive jamais car file create à chaque appel de SAve

            Affiche_erreur("Fichier introuvable, vérifier la présence du disque amovible si vous en utilisez un", e.Message)

            'Catch e As FileLoadException 
        Catch e As Exception

            Affiche_erreur("erreur d'accés au fichier, Ex : Lecture seul", e.Message)

        Finally

            If Not myFileStream Is Nothing Then myFileStream.Close()
        End Try

    End Sub
    '
    '----------------------------------------------------------------------
    ' fonction qui lit le fichier sérialisé de la class
    '----------------------------------------------------------------------
    Public Function load(ByVal fichier As String) As Boolean
        Dim myFileStream As Stream = Nothing

        Try
            myFileStream = File.OpenRead(fichier)
            Dim deserializer As New BinaryFormatter()
            Dim lecture As New cls_table
            lecture = CType(deserializer.Deserialize(myFileStream), cls_table)
            myFileStream.Close()


            ' attribut la liste des lignes à me
            Me.lignes = lecture.lignes
            Return True

        Catch e As Exception

            Affiche_erreur("erreur d'accés au fichier", e.Message)
            Return False

        Finally

            If Not myFileStream Is Nothing Then myFileStream.Close()
        End Try
    End Function
    '
    '----------------------------------------------------------------------
    'affiche les erreurs de fichier dans les sub Save et Load
    '----------------------------------------------------------------------
    Private Sub Affiche_erreur(ByVal HelpMsg As String, ByVal ErMsg As String)
        MessageBox.Show(HelpMsg _
               & Environment.NewLine & ErMsg, "Erreur critique !" _
               , MessageBoxButtons.OK, MessageBoxIcon.Error)
    End Sub

End Class


Option Explicit On
Option Strict On
Imports System
Imports System.IO
Imports System.Runtime.Serialization.Formatters.Binary
Imports System.Collections.Generic

<Serializable()> Public Class cls_ligne
    Public x, y, z As Double
    Public id As String ' identifiant unique de la ligne (si besoin de rechercher une ligne)
    Public t As DateTime ' déclare la date pour l'affichage voir ici http://msdn.microsoft.com/fr-fr/library/zdtaw1bw(VS.95).aspx
    '----------------------------------------------------------------------
    ' Création d'une nouvelle ligne de coordonnées, soit vierge, soit avec valeurs
    '----------------------------------------------------------------------
    Public Sub New()
        'créé un numéro unique pour chaque ligne (si besoin)
        id = System.Guid.NewGuid.ToString
    End Sub
    Public Sub New(ByVal _x As Double, _
                   ByVal _y As Double, _
                   ByVal _z As Double, _
                   ByVal _t As Date)
        'créé un numéro unique pour chaque ligne (si besoin)
        id = System.Guid.NewGuid.ToString
        x = _x
        y = _y
        z = _z
        t = _t
    End Sub
    '
    '----------------------------------------------------------------------
    ' renvoie une ligne compléte formatée pour une listview
    '----------------------------------------------------------------------
    Public Function ToListView() As ListViewItem
        'déclare et intancie une nouvelle ligne de listview
        Dim listItem As ListViewItem = New ListViewItem

        With listItem
            'permet d'avoir plusieurs couleurs sur une même ligne de listview
            .UseItemStyleForSubItems = False
            'index de ligne (GUID)
            .Text = Me.id
            'formate l'affichage de la date
            .SubItems.Add(Me.x.ToString)
            .SubItems.Add(Me.y.ToString)
            .SubItems.Add(Me.z.ToString)
            .SubItems.Add(Me.t.ToString("mm:ss:ff")) '(pour le choix d'affichage voir ici : http://msdn.microsoft.com/fr-fr/library/zdtaw1bw(VS.95).aspx)
        End With

        Return listItem
    End Function
    '
    '----------------------------------------------------------------------
    ' renvoie une ligne compléte pour un fichier CSV
    '----------------------------------------------------------------------
    Public Function ToCsv() As String
        '"date;x;y;z"

        'un stringBuilder consomme bien moins de ressource lors d'ajout de texte comme ICI :
        Dim MyStringBuilder As New Text.StringBuilder(Me.t.ToString("dd/MM/yy") & ";")
        MyStringBuilder.Append(Me.x & ";")
        MyStringBuilder.Append(Me.y & ";")
        MyStringBuilder.Append(Me.z & ";")
        MyStringBuilder.Append(Environment.NewLine)
        ToCsv = MyStringBuilder.ToString

    End Function

End Class



tiens essaye de comprendre ce code il te rendra bien service, PCPT m'a aidé là dessus, à mon tour de rendre ce service ;)