treeView kopieren???

  • C#

Es gibt 1 Antwort in diesem Thema. Der letzte Beitrag () ist von hal2000.

    treeView kopieren???

    Hallo Leute, und danke für es reinschauen. darf ich eine frage bezüglich treeview stellen:

    mein TreeView wird nicht aktualisiert. Wenn ich es einfach per Button1 mache, dann klappt es. Wenn ich es per BackgroundWorker mache, dann nicht. Mein Code:

    Quellcode

    1. private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
    2. {
    3. try
    4. {
    5. DateTime date = (DateTime)e.Argument;
    6. TreeNode treeNode = new TreeNode("Windows");
    7. treeNode = new TreeNode("Linux");
    8. TreeNode node2 = new TreeNode("C#");
    9. TreeNode node3 = new TreeNode("VB.NET");
    10. TreeNode[] array = new TreeNode[] { node2, node3 };
    11. treeNode = new TreeNode("Dot Net Perls", array);
    12. e.Result = treeNode;
    13. }
    14. catch(Exception fehler)
    15. {
    16. Sys3.Tools.Sys3Dialog.Sys3Fehlermeldung("Fehlermeldung", fehler.Message);
    17. }
    18. }
    19. private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
    20. {
    21. }
    22. private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    23. {
    24. progressBar1.Style = ProgressBarStyle.Marquee;
    25. groupBox1.Enabled = true;
    26. groupBox2.Enabled = true;
    27. //treeView1.Nodes.Clear();
    28. TreeNode treeNode = ((TreeNode)e.Result);
    29. treeView1.Nodes.Clear();
    30. treeView1.Nodes.Add(treeNode);
    31. //treeView1.Refresh();
    32. }


    Warum ich das per Backgroundworker machen will, hat etwas längere geschickte. Die teile müssen aus einer Datenbank erst mühsam rausgesucht werden. und sind etwas mehr datensätze. deswegen wollte ich es per backgroundworker machen...

    Kann mir jemand sagen, warum die teile bei dem treeView1 nicht dargestellt werden?

    Danke euch.
    Ganz böse: Du hast ein TreeView im UI-Thread erstellt und möchstest TreeNodes einfügen, die aus einem Workerthread kommen. Das funktioniert nicht. Du solltest nur das im Nebenthread machen, was _wirklich_ lange dauert - in deinem Fall das Lesen aus der DB. Das Ergebnis in Nodes zu schreiben geht dagegen schnell und muss im UI-Thread erfolgen.

    Du kannst zwei Modelle fahren: Mit oder ohne Teilergebnisse. Ohne werden alle Nodes in einem Rutsch in RunWorkerCompleted erstellt. Hast du Teilergebnisse, werden die Nodes in ProgressChanged erstellt. Dazu musst du dir ein "Protokoll" überlegen, etwa so:

    VB.NET-Quellcode

    1. Private Enum NodeLocation
    2. Current
    3. Parent
    4. NewChild
    5. End Enum
    6. Private Class NodeData
    7. Property Location As NodeLocation
    8. Property Data As String
    9. End Class
    10. Private currentNode As TreeNode
    11. Sub ProgressChanged()
    12. Dim arg As NodeData = DirectCast(e.UserState, NodeData)
    13. Dim node As New TreeNode(arg.Data)
    14. Select arg.Location
    15. 'Node einfügen, neue Ebene erstellen oder Ebene abschließen
    16. End Select
    17. currentNode = node 'oder node.Parent, je nach arg.Location
    18. End Sub
    19. Sub DoWork()
    20. 'Teilergebnisse entsprechend an ReportProgress() übergeben.
    21. End Sub
    Gruß
    hal2000