Remplissage d'un TreeView par un thread [Résolu]

Messages postés
11
Date d'inscription
mercredi 24 septembre 2003
Dernière intervention
14 juin 2005
- - Dernière réponse : ofeelfree
Messages postés
11
Date d'inscription
mercredi 24 septembre 2003
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. :)
Afficher la suite 

1 réponse

Meilleure réponse
Messages postés
11
Date d'inscription
mercredi 24 septembre 2003
Dernière intervention
14 juin 2005
3
Merci
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.

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 99 internautes nous ont dit merci ce mois-ci

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.