[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 :mrgreen:
Toujours dans mon programme de gestion pour compagnie d'autocar (certains commencent surement à me connaître :oops: ), 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:
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:
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.