Comportement étrange avec l'utilisation de Datagridview.Rows.clear()
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:
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:
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!
[ Resolu ] Comportement étrange avec l'utilisation de Datagridview.Rows.clear()
Pol63, je te remercie pour tes explication j'ai beaucoup avance et decouvert quelque chose de nouveau !
J'ai donc mis le code dans la gestion du bouton et j'ai reduit le timeout a 120 pour lever l'erreur du timeout. Donc maintenant mon treeview et mon tableau s'affiche de deux couleurs differente en fonction de l'etat de l'ordinateur distant.
Merci encore,
Bonne soiree !