ofeelfree
Messages postés9Date d'inscriptionmercredi 24 septembre 2003StatutMembreDernière intervention14 juin 2005
-
8 févr. 2005 à 09:21
ofeelfree
Messages postés9Date d'inscriptionmercredi 24 septembre 2003StatutMembreDernière intervention14 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 ?
ofeelfree
Messages postés9Date d'inscriptionmercredi 24 septembre 2003StatutMembreDernière intervention14 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.