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).
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".
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
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.
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) :
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
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.
Partager