IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Forms Discussion :

[VB.NET] Hashtable : mise à jour


Sujet :

Windows Forms

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre expérimenté
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Par défaut [VB.NET] Hashtable : mise à jour
    Bonsoir tout le monde.

    J'apporte ce soir un phénomène étrange. Enfin du moins, je ne le comprends pas

    Toujours dans mon programme de gestion pour compagnie d'autocar (certains commencent surement à me connaître ), j'ai dans le formulaire de confirmation d'une offre, la possibilité d'assigner jusqu'à 3 chauffeurs par cars.

    Pour ce faire, j'utilise une hashtable avec comme clé, le nom du car et comme objet, un tableau de strings contenant les noms des-dits chauffeurs ou des strings vident si aucun chauffeur n'a encore été affecté.

    L'affection des chauffeurs se déroule comme suit :
    • Sélection du car dans le composant ListView
    • Sélection des chauffeurs (jusqu'à 3) au moyen de 3 ComboBox


    Le bout de code que je vous montre ci-dessous est celui de la procédure appelée lorsque l'index sélectionné de la première ComboBox est modifié.
    (Il s'agit du même code pour les 2 autres ComboBox, il n'y a que la référence à la ComboBox qui change).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    Dim arrayChauffeur() As String
            Dim i, j As Byte
     
            Try
                If verif_chauffeur(Me.cbChauffeur1.Text) Then
                    For i = 0 To Me.lvCars.Items.Count - 1
                        If Me.lvCars.Items(i).Selected Then
                            j = i
                        End If
                    Next
                    arrayChauffeur = chauffeurs1.Item(Me.lvCars.Items(j).Text)
                    arrayChauffeur(0) = Me.cbChauffeur1.Text
                    chauffeurs1.Item(Me.lvCars.Items(j).Text) = arrayChauffeur
                Else
                    MessageBox.Show("Vous avez déjà affecté ce chauffeur à un car.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
                    Me.cbChauffeur1.Text = ""
                End If
            Catch ex As Exception
                MessageBox.Show(ex.Message)
            End Try
    Mon problème est que après l'exécution de bout de code, tous les éléments de la hashtable "chauffeurs1" ont été modifé et remplacer par le tableau "arrayChauffeur".

    J'ai vérifié en mode pas à pas et en affichant des messages. La clé est bien la bonne et tout n'a lieu qu'une seule fois. Je ne parviens pas à comprendre pourquoi tous les objets sont mis à jour.

    Merci d'avance à ceux qui pourront m'aider et aussi à ceux qui prendront la peine de lire ce message.

    Griftou.

    P.S. :

    Voici le morceau de code où la hashtable est initialisée.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    Dim car As String
                car = dataRow.Item("CAR")
                'séparation de la liste des cars et mise en tableau
                Dim arrayCars() As String = Split(car, ";")
                'création du dictionnaire avec la capacité nécessaire
                chauffeurs1 = New Hashtable(arrayCars.Length)
                If dataRow.Item("CONFIRMEE") Then
                    Me.btnCancel.Enabled = True
                    Me.btnConfirmer.Text = "Enregistrer"
                    Me.tbAcompte.Text = Math.Round(Double.Parse(dataRow.Item("ACOMPTE").ToString), 2)
                    Me.dtpDate.Text = dataRow.Item("DATE_CONFIRMATION")
                    Dim chauffeursDB As String
                    Dim n As Byte
                    'récupération du champ chauffeur de la db
                    chauffeursDB = dataRow.Item("CHAUFFEURS")
                    'séparation du champ par car
                    Dim arrayChauffeurs() As String = Split(chauffeursDB, ";")
                    'remplissage du dictionnaire clé=plaque du car / objet=tableau de chauffeurs
                    For n = 0 To arrayChauffeurs.Length - 1
                        Dim arrayTmp() As String = Split(arrayChauffeurs(n), "&")
                        chauffeurs1.Add(arrayTmp(0), Split(arrayTmp(1), "|"))
                    Next
                Else
                    Dim n As Byte
                    Dim chf() As String = New String() {"", "", ""}
                    For n = 0 To arrayCars.Length - 1
                        Dim cars() As String = Split(arrayCars(n), "|")
                        chauffeurs1.Add(cars(0), chf)
                    Next
                    Me.btnConfirmer.Text = "Confirmer"
                    Me.dtpDate.Text = Today
                    Me.tbAcompte.Text = "0"
                End If
    Il a fallu que je "réorganise" ma DB après coup, c'est pourquoi la structure des champs peut paraître bizarre mais néanmoins logique. Je l'explique (ce qui expliquera le pourquoi de tous ces split) :

    Le champ CAR est de type string et structuré comme suit :
    • nom du 1e car
    • |
    • capacité du car
    • nom du 2e car
    • |
    • capacité du car
    • etc.....


    Concaténez les éléments et vous obtiendrez un exemple de ce que contient le champ CAR.

    Le champ CHAUFFEUR est de type string et structuré comme suit:
    • nom du 1e car
    • &
    • nom du 1e chauffeur
    • |
    • nom du 2e chauffeur
    • |
    • nom du 3e chauffeur
    • ;
    • nom du 2e car
    • &
    • nom du 1e chauffeur
    • |
    • nom du 2e chauffeur
    • |
    • nom du 3e chauffeur
    • etc.....


    Concaténez les éléments et vous obtiendrez un exemple de ce que contient le champ CAR.

  2. #2
    Membre expérimenté
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Par défaut
    Personne n'a une idée ?

    Griftou.

  3. #3
    Membre Expert Avatar de Mose
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 143
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 143
    Par défaut
    Moi y'en n'a pas causer VB, mais en exécution pas-à-pas, tu devrais voir la valeur qui est calculée et assignée aux cases de ta Hashtable.
    Hope this helps

  4. #4
    Membre expérimenté
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Par défaut
    Citation Envoyé par Mose
    Moi y'en n'a pas causer VB, mais en exécution pas-à-pas, tu devrais voir la valeur qui est calculée et assignée aux cases de ta Hashtable.
    Hope this helps
    Toi y'en n'a peut-être pas causer VB mais toi pas avoir lu message.

    Citation Envoyé par griftou
    J'ai vérifié en mode pas à pas et en affichant des messages. La clé est bien la bonne et tout n'a lieu qu'une seule fois. Je ne parviens pas à comprendre pourquoi tous les objets sont mis à jour.
    Plus sérieusement, j'ai déjà fait à maintes reprises l'exécution pas-à-pas. L'objet ajouté est bien celui qui doit l'être et la clé est bien la bonne. De plus, ce n'est fait qu'une fois. Mais cela n'empêche que tous les objets de la table sont modifés.

    C'est là qu'est mon problème, je ne comprends pas pourquoi.

    Griftou.

  5. #5
    Membre Expert
    Avatar de Mehdi Feki
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 113
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 113
    Par défaut
    Salut griftou,

    Il est impossible dans une hashtable que la modification de la valeur d'une clé change la valeur des autres clés, pour la simple raison est que la hashtable stoque des clés unique. L'unicité dans ton cas est assurée par des clés en string.

    Donc forcement y a un autre probleme, je vais encore t'embeter et te demander de faire un petit breakpoint sur

    Citation Envoyé par code de griftou
    chauffeurs1.Item(Me.lvCars.Items(j).Text) = arrayChauffeur
    voir le continue de la collection juste avant et apres l'execution de cette ligne pour voi si le changement qui se fait sur toute la hashtable est causée par cette ligne.

    Une derniere chose je n'ai pas pu suivre à fond le deroulement de ton code mais j'ai un petit doute sur ca :

    Citation Envoyé par code de griftou
    For n = 0 To arrayChauffeurs.Length - 1
    Dim arrayTmp() As String = Split(arrayChauffeurs(n), "&")
    chauffeurs1.Add(arrayTmp(0), Split(arrayTmp(1), "|"))
    Next
    sûr de l'index 0 de ArrayTmp ?

    Voila A+

  6. #6
    Membre expérimenté
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Par défaut
    Citation Envoyé par mehdi_tn
    Il est impossible dans une hashtable que la modification de la valeur d'une clé change la valeur des autres clés, pour la simple raison est que la hashtable stoque des clés unique.
    Je suis bien d'accord avec toi. D'où mon incompréhension.

    Je testerai le breakpoint ce soir car je suis actuellement au boulot.

    Sinon, pour le arrayTmp(0), c'est correct.

    En fait, le champ de la DB se présente comme suit :

    car1&chauffeurA|chauffeurB;car2&chauffeurA|chauffeurB|chauffeurC;car3&chauffeurA

    J'effectue d'abord un split avec le ";" comme séparateur de manière à avoir chaque car et son (ses) chauffeur(s) dans le tableau arrayChauffeurs.

    J'effectue un second split avec le "&" pour chaque élément du tableau arrayChauffeurs pour avoir dans le tableau arrayTmp le nom du car et la liste des chauffeurs.

    J'affecte donc à mon hashtable des éléments étant des tableaux de string (split de arrayTmp(1) avec "|" comme séparateur) et ayant comme clé le nom du car (arrayTmp(0)).

    Voilà.

    Ai-je été clair?

    Griftou.

Discussions similaires

  1. vb.net - MySQL mise à jour d'un enregistrement
    Par gastoncs dans le forum VB.NET
    Réponses: 3
    Dernier message: 08/10/2012, 16h54
  2. Réponses: 2
    Dernier message: 22/05/2008, 15h07
  3. Réponses: 2
    Dernier message: 02/05/2006, 22h09
  4. [VB.NET][VS2003] mise à jour et .exe
    Par HULK dans le forum Windows Forms
    Réponses: 9
    Dernier message: 25/01/2006, 14h44
  5. Mise à jour Windows CE .NET
    Par G3G3 dans le forum Windows Serveur
    Réponses: 2
    Dernier message: 15/06/2005, 18h55

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo