Treeview Nodes über Thread ändern

  • VB.NET
  • .NET (FX) 4.0

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von kayle.

    Treeview Nodes über Thread ändern

    Hallo zusammen,

    mit dem folgenden Code befülle ich im MainForm Load Event ein Treeview mit einem Root Node und mehreren Child Nodes. Mit dem Button btnPing durchlaufe ich die Nodes und suche Child Nodes mit Level 2. Diese Nodes werden dann mit My.computer.network.ping abgefragt und der ForeColor des Child Node wird dann je nach Ergebnis rot oder grün eingefärbt. Das ganze klappt auch. Allerdings friert mir das GUI jedesmal dabei ein.

    VB.NET-Quellcode

    1. '### TreeView Test
    2. Option Explicit On
    3. Option Strict On
    4. Public Partial Class MainForm
    5. Public Sub New()
    6. Me.InitializeComponent()
    7. End Sub
    8. '### Hauptprogramm wird geladen ###
    9. Sub MainFormLoad(sender As Object, e As EventArgs)
    10. 'Treeview befüllen
    11. With treeView1
    12. .Nodes.Add("Test1")
    13. .Nodes(0).Nodes.Add("Test1_a")
    14. .Nodes(0).Nodes.Add("Test1_b")
    15. .Nodes(0).Nodes.Add("Test1_c")
    16. .Nodes(0).Nodes(0).Nodes.Add("10.23.59.1")
    17. .Nodes(0).Nodes(1).Nodes.Add("10.23.59.90")
    18. .Nodes(0).Nodes(1).Nodes.Add("10.23.59.90")
    19. .Nodes(0).Nodes(2).Nodes.Add("10.23.59.10")
    20. .Nodes(0).Nodes(2).Nodes.Add("10.23.59.11")
    21. .Nodes(0).Nodes(2).Nodes.Add("10.23.59.12")
    22. .Nodes(0).Nodes(2).Nodes.Add("10.23.59.13")
    23. .Nodes(0).Nodes(2).Nodes.Add("10.23.59.14")
    24. End With
    25. 'Treeview aufklappen
    26. treeView1.ExpandAll
    27. End Sub
    28. '### Sub zum rekursiven durchsuchen der Nodes ###
    29. Private Sub RecurseNodes(ByVal col As TreeNodeCollection)
    30. For Each tn As TreeNode In col
    31. If tn.Level = 2 Then
    32. Try
    33. If My.Computer.Network.Ping(tn.Text) Then
    34. tn.ForeColor = Color.Green
    35. tn.StateImageIndex= 4
    36. Else
    37. tn.ForeColor = Color.Red
    38. tn.StateImageIndex=5
    39. End If
    40. Catch ex As Exception
    41. tn.ForeColor = Color.Red
    42. tn.StateImageIndex=5
    43. End Try
    44. End If
    45. If tn.Nodes.Count > 0 Then
    46. RecurseNodes(tn.Nodes)
    47. End If
    48. Next tn
    49. End Sub
    50. '### Button zum starten der rekursiven Suche ###
    51. Sub BtnPingClick(sender As Object, e As EventArgs)
    52. 'Treeview rekursiv durchsuchen
    53. RecurseNodes(treeView1.Nodes)
    54. End Sub
    55. End Class


    Jetzt möchte ich das ganze so umbauen das der Ping in einem separatem Thread abläuft. Jetzt habe ich nur eine Verständnisfrage zum Ablauf. Kann ich einen Thread mit Parameterübergabe starten? Dann würde ich durch die Liste laufen und bei jeder Node mit Level 2 einen Thread starten und auf Rückmeldung warten. Wie wäre hier die beste Vorgehensweise?

    Vielen Dank im Voraus
    Gruß Kay

    kayle schrieb:

    Habe zwar noch keinen Plan wie ich das mit dem Invoke für das Treeview anstelle
    Da findest Du doch hier im Forum gefühlt 1000 Posts mit richtigem Code.

    VB.NET-Quellcode

    1. Me.BeginInvoke(Sub() EINE_PROZEDUR_DIE_IM_MAINTHREAD_LAEUFT())
    2. ' ...
    3. Private Sub EINE_PROZEDUR_DIE_IM_MAINTHREAD_LAEUFT()
    4. ' hier was im Main-Thread tun
    5. End Sub
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!