Bonsoir,

je rencontre un problème avec datagridview.Rows.clear() (Frameworkk .Net 3.5) que je n'arrive pas à solutioner.

Je dispose d'un treeview que je charge à l'aide d'un fichier. Dès que je clique sur un bouton "tester" je parcours chaque noeux du treeview et j'ajoute une ligne au tableau. Donc si j'ai "12 noeux" au treeview je dois avoir 12 lignes au tableau.

Treeview :

nodes(0)
nodes(0).nodes(0)
nodes(0).nodes(1)
....
nodes(0).nodes(11)

Salle_A
|______ Ordinateur_1
|______ Ordinateur_2
|______ Ordinateur_3

|______ Ordinateur_12

J'obtiens le résultat souhaité. Sauf que je suis confronté à un comportement aléatoire. Je m'explique, si je clique 8 fois sur le bouton "tester", le tableau me charge correctement les 12 lignes correspondantes au 12 noeux du treeview. Au 9è click ou 10è (celà peux être plus ou moins de fois), le tableau affiche les 12 lignes correctement et y ajoute à nouveau ces 12 même lignes. Je ne comprend pas pourquois.

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
Private Sub btn_tester_Click()
   load_tv()
   check_ordi()
End Sub
 
Private Sub check_ordi()
 
        If dgv.Rows.Count = 0 Then
 
            Dim i As Integer = 0
            While i < tv.Nodes(0).Nodes.Count
               //appel de la fonction pour ajouter une ligne au tableau
                i += 1
             End While
 
         Else
              dgv.Rows.clear()
              check_ordi()
          End if
 
End Sub

Pour comprendre le problème j'affiche la valeur de i dans un label. Je peux donc constater son incrémentation. Par exemple, je clique 8 fois sur le bouton "tester", i s'incrémente bien de 0 à 11 (11 étant toujours le maximun). Au neuvième click, i passe de 0 à 11 puis est réinitialisé à 0 à ce moment là, le programme àjoute donc 12 nouvelles lignes au tableau et je me retrouve donc avec 2 fois 12 lignes.

Je ne comprend pas à quel moment i est réinitialisé à 0 alors que j'atteinds tv.Nodes(0).Nodes.Count.

Code complet :

Note Lorsque je teste Me.isLocal = False.

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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
 
Private Sub check_ordi()
        Dim i As Integer = 0
 
        If dgv.Rows.Count = 0 Then
 
            While i < tv.Nodes(0).Nodes.Count
                lbl_count.Text = i
                If is_online(tv.Nodes(0).Nodes(i).Name) Then
 
                    If Me.isLocal Then
                        run_process(Me.tv.Nodes(0).Nodes(i).Name)
                        import_csv()
                        Me.load_gdv()
                    Else
 
                        dgv_ordi(Me.tv.Nodes(0).Nodes(i).Name, i)
 
                    End If
                    tv.Nodes(0).Nodes(i).BackColor = Color.GreenYellow
                    dgv.Rows(i).DefaultCellStyle.BackColor = Color.GreenYellow
                Else
                    dgv_ordi(Me.tv.Nodes(0).Nodes(i).Name, i)
 
                    tv.Nodes(0).Nodes(i).BackColor = Color.LemonChiffon
                    dgv.Rows(i).DefaultCellStyle.BackColor = Color.LemonChiffon
                End If
                Application.DoEvents()
                i += 1
            End While
 
        Else
 
            dgv.Rows.Clear()
            Me.check_ordi()
        End If
End Sub
 
 
' cette procédure va ajouter seulement une ligne au tableau :
' je regarde la valeur du noeux (Nodes(0).Nodes(i).Name)
' et lance une recherche dans un dictionaire contenant une liste 
' d'ordinateur chargés à partir d'un fichier
Private Sub dgv_ordi(ByVal Ordip As String, ByVal i As Integer)
 
     Dim nom, ip, mac as String
     ip=""
     mac=""
     nom=""
 
       For Each kpv As KeyValuePair(Of String, Dictionary(Of String, String)) In Me.dicOrdi
 
            If kpv.Key = Ordip Then
                For Each k As KeyValuePair(Of String, String) In kpv.Value
                    Select Case k.Key
                        Case "nom"
                            nom= k.Value
                        Case "ip"
                            ip = k.Value
                        Case "mac"
                            mac = k.Value
 
                    End Select
                Next
 
                Dim line = New String() {"text", "text", "text", "text", nom, ip, mac, "text"}
                dgv.Rows.Add(line)
 
            End If
        Next
 
 
End Sub
Je vous remercie d'avance pour votre aide!