Remplissage d'un TreeView par un thread

Résolu
ofeelfree Messages postés 9 Date d'inscription mercredi 24 septembre 2003 Statut Membre Dernière intervention 14 juin 2005 - 8 févr. 2005 à 09:21
ofeelfree Messages postés 9 Date d'inscription mercredi 24 septembre 2003 Statut Membre Dernière intervention 14 juin 2005 - 8 févr. 2005 à 19:50
Bonjour,

Voici mon problème : j'ai un formulaire qui contient un TreeView, et une méthode qui remplit ce TreeView avec la liste des ordinateurs d'un domaine.
Ça fonctionne mais quand le domaine est important l'appli est bloquée pendant un moment. J'ai donc créé un thread secondaire qui lance la méthode. Mais apparemment je ne peux pas mettre à jour le TreeView à partir du thread secondaire. Ça me dit : "vous devez utiliser Control.Invoke ou Control.BeginInvoke...).

Voici le code :

Public Class frmMain

Inherits System.Windows.Forms.Form

Friend WithEvents tvMain as TreeView
Friend WithEvents btnGo as Button
[...]
Private Sub btnGo_Click(ByVal sender as Object, ByVal e as EventArgs) Handles btnGo.Click
Dim t As New Thread(AddressOf Me.Scan)
t.Start()
End Sub

Private Sub Scan()
For Each [Computer] In [Domain]
Me.tvMain.Nodes.Add(New TreeNode([Computer].Name))
Next [Computer]
End Sub

End Class

Quelqu'un aurait-il une piste, ou même un lien vers une source qui traiterait d'un problème similaire ?

Merci d'avance. :)

1 réponse

ofeelfree Messages postés 9 Date d'inscription mercredi 24 septembre 2003 Statut Membre Dernière intervention 14 juin 2005
8 févr. 2005 à 19:50
Rebonjour,
J'ai trouvé la solution, je la livre pour ceux que ça intéresse (les ajouts sont en bleu, ce qui a été retiré en rouge) :

Public Class frmMain

Inherits System.Windows.Forms.Form

Private Delegate Sub AddTreeDelegate(ByRef Target as Object, ByRef Node as TreeNode)

Friend WithEvents tvMain as TreeView
Friend WithEvents btnGo as Button
[...]
Private Sub btnGo_Click(ByVal sender as Object, ByVal e as EventArgs) Handles btnGo.Click
Dim t As New Thread(AddressOf Me.Scan)
t.Start()
End Sub

Private Sub AddTreeNode(ByRef Target as Object, ByRef Node as TreeNode)
If (TypeOf Target Is TreeView) Then
DirectCast(Target, TreeView).Nodes.Add(Node)
ElseIf (TypeOf Target Is TreeNode) Then
DirectCast(Target, TreeNode).Nodes.Add(Node)
End If
End Sub

Private Sub Scan()
Dim atd As New AddTreeDelegate(AddressOf Me.AddTreeNode)
Dim args(1) as Object
For Each [Computer] In [Domain]
'Me.tvMain.Nodes.Add(New TreeNode([Computer].Name))
args(0) = Me.tvMain
args(1) = New TreeNode([Computer].Name)
Me.tvMain.BeginInvoke(atd, args)
Next [Computer]
End Sub

End Class

Et voilà, à présent le TreeView se remplit au fur et à mesure et l'application reste disponible pour répondre aux événements.

Bon code à tous.
3
Rejoignez-nous