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

ofeelfree 11 Messages postés mercredi 24 septembre 2003Date d'inscription 14 juin 2005 Dernière intervention - 8 févr. 2005 à 09:21 - Dernière réponse : ofeelfree 11 Messages postés mercredi 24 septembre 2003Date d'inscription 14 juin 2005 Dernière intervention
- 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
ofeelfree 11 Messages postés mercredi 24 septembre 2003Date d'inscription 14 juin 2005 Dernière intervention - 8 févr. 2005 à 19:50
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.

Merci ofeelfree 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 93 internautes 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.