TReeView, User soll Treeview selbst einen Baum anlegen können + speichern als XML?

  • VB.NET

Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von lris08.

    TReeView, User soll Treeview selbst einen Baum anlegen können + speichern als XML?

    Hallo,

    bisher habe ich den Baum im Treeview selbst vorgegeben.

    Nun ist der Wunsch bei uns, dass der Baum von einigen Mitarbeitern selbst bearbeitet werden kann/soll.

    Habe mir nun das Treeview angeschaut und soweit verstehe ich das auch mit dem ganzen gedöns :)

    z.B.

    VB.NET-Quellcode

    1. TreeView_Kategorien.Nodes.Add(EINTAG, EINEBESCHREIBUNG)


    So weit so gut... was ich aber nicht herausfinden konnte ist wie ich dem Nodes.Add beibringe das er nun ein Subnodes ist.

    Beispiel:
    Tag Beschreibung
    001 Ordner
    002 +-- DIN A4 Ordner
    003 +-- DIN A5 Ordner
    usw.

    Könnt Ihr mir da mal helfen ?

    Gruß
    lris
    Danke...
    soeben schnelle Vatiante entdeckt, die mir sogar auch mal ein Licht ins Dunkle bringt :)

    ABER...

    Würdet Ihr das so verwenden ? ... leider habe ich es noch nicht geschafft, auch einen Node.Tag einzufügen...
    Aber wäre der den Sinnvoll?

    Die Kategorien werden auch übernommen, zu Sortierung von Dokumentenmappen nachher - Verträge usw.

    VB.NET-Quellcode

    1. Imports System.Xml
    2. Imports System.IO
    3. Public Class DokManagement_Kategorien
    4. Friend Wert As String
    5. Private Sub DokManagement_Kategorien_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
    6. Wert = Nothing
    7. If File.Exists("Parameter\Kategorien.xml") Then
    8. Me.TreeView_Kategorien.Nodes.Clear()
    9. LoadFromXml("Parameter\Kategorien.xml", Me.TreeView_Kategorien)
    10. End If
    11. End Sub
    12. Private Sub TreeView1_AfterSelect(sender As System.Object, e As System.Windows.Forms.TreeViewEventArgs) Handles TreeView_Kategorien.AfterSelect
    13. MsgBox(e.Node.Tag)
    14. End Sub
    15. Private Sub btn_ok_Click(sender As System.Object, e As System.EventArgs) Handles btn_ok.Click
    16. SaveToXml("Parameter\Kategorien.xml", Me.TreeView_Kategorien)
    17. Me.Close()
    18. End Sub
    19. Private Sub btn_abbrechen_Click(sender As System.Object, e As System.EventArgs) Handles btn_abbrechen.Click
    20. Me.Close()
    21. End Sub
    22. Private Sub btn_neu_Click(sender As System.Object, e As System.EventArgs) Handles btn_neu.Click
    23. DokManagement_Kategorien_Eingabe.ShowDialog()
    24. If Not Me.TreeView_Kategorien.SelectedNode Is Nothing Then
    25. Dim Node As TreeNode = Me.TreeView_Kategorien.SelectedNode
    26. Call AddNodes(Node)
    27. End If
    28. End Sub
    29. Private Sub AddNodes(ByVal Node As TreeNode)
    30. Dim SubNode As New TreeNode
    31. With SubNode
    32. .Text = Wert
    33. End With
    34. Node.Nodes.Add(SubNode)
    35. End Sub
    36. Public Shared Sub LoadFromXml(ByVal FileName As String, ByVal TheTreeView As TreeView)
    37. Dim xDoc As New XmlDocument
    38. xDoc.Load(FileName)
    39. FillTreeView(TheTreeView.Nodes, xDoc.DocumentElement)
    40. End Sub
    41. Private Shared Sub FillTreeView(ByVal CurrentNodes As TreeNodeCollection, _
    42. ByVal xNode As XmlNode)
    43. For Each xChild As XmlNode In xNode.ChildNodes
    44. FillTreeView(CurrentNodes.Add(xChild.Name).Nodes, xChild)
    45. Next
    46. End Sub
    47. ' TreeView-Inhalt (Nodes-Objekte) als XML-Datei speichern
    48. Public Shared Sub SaveToXml(ByVal FileName As String, ByVal TheTreeView As TreeView)
    49. Dim xDoc As New XmlDocument
    50. xDoc.LoadXml("<Nodes></Nodes>")
    51. SaveNodes(xDoc.DocumentElement, TheTreeView.Nodes)
    52. xDoc.Save(FileName)
    53. End Sub
    54. Private Shared Sub SaveNodes(ByVal xNode As XmlNode, ByVal CurrentNodes As TreeNodeCollection)
    55. For Each tn As TreeNode In CurrentNodes
    56. Debug.WriteLine(tn.Text)
    57. SaveNodes(xNode.AppendChild(xNode.OwnerDocument.CreateElement(tn.Text)), tn.Nodes)
    58. Next
    59. End Sub
    60. End Class

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „lris08“ ()

    Guten Morgen,

    habe heute schon daran rumgefummelt.... soweit funktioniert das alles...

    Nur habe ich noch das Problem, dass er mir den Node.Tag nicht mit abspeichert und wieder einliest...

    Habt Ihr da vielleicht noch eine Idee??

    VB.NET-Quellcode

    1. Public Shared Sub LoadFromXml(ByVal FileName As String, ByVal TheTreeView As TreeView)
    2. Dim xDoc As New XmlDocument
    3. xDoc.Load(FileName)
    4. FillTreeView(TheTreeView.Nodes, xDoc.DocumentElement)
    5. End Sub
    6. Private Shared Sub FillTreeView(ByVal CurrentNodes As TreeNodeCollection, ByVal xNode As XmlNode)
    7. For Each xChild As XmlNode In xNode.ChildNodes
    8. FillTreeView(CurrentNodes.Add(xChild.Name).Nodes, xChild)
    9. Next
    10. End Sub
    11. ' TreeView-Inhalt (Nodes-Objekte) als XML-Datei speichern
    12. Public Shared Sub SaveToXml(ByVal FileName As String, ByVal TheTreeView As TreeView)
    13. Dim xDoc As New XmlDocument
    14. xDoc.LoadXml("<Nodes></Nodes>")
    15. SaveNodes(xDoc.DocumentElement, TheTreeView.Nodes)
    16. xDoc.Save(FileName)
    17. End Sub
    18. Private Shared Sub SaveNodes(ByVal xNode As XmlNode, ByVal CurrentNodes As TreeNodeCollection)
    19. For Each tn As TreeNode In CurrentNodes
    20. Debug.WriteLine(tn.Text)
    21. SaveNodes(xNode.AppendChild(xNode.OwnerDocument.CreateElement(tn.Text)), tn.Nodes)
    22. Next
    23. End Sub


    GRuß
    lris
    Also das mit dem spehcern habe ich hinbekommen...

    VB.NET-Quellcode

    1. Private Function XmlRekursivExport(nodeElement As XmlNode, treeNodeCollection As TreeNodeCollection) As XmlNode
    2. Dim xmlNode As XmlNode = Nothing
    3. For Each treeNode As TreeNode In treeNodeCollection
    4. xmlNode = xmlDocument.CreateElement("TreeViewNode")
    5. xmlNode.Attributes.Append(xmlDocument.CreateAttribute("value"))
    6. xmlNode.Attributes("value").Value = treeNode.Text
    7. xmlNode.Attributes.Append(xmlDocument.CreateAttribute("tag"))
    8. xmlNode.Attributes("tag").Value = treeNode.Tag
    9. If nodeElement IsNot Nothing Then
    10. nodeElement.AppendChild(xmlNode)
    11. End If
    12. If treeNode.Nodes.Count > 0 Then
    13. XmlRekursivExport(xmlNode, treeNode.Nodes)
    14. End If
    15. Next
    16. Return xmlNode
    17. End Function


    nur das Auslesen, daran verweifel ich gerade...

    Vielleicht könnts ma da helfen??

    VB.NET-Quellcode

    1. Public Sub LoadXmlToTreeView(path As [String], treeView As TreeView)
    2. xmlDocument = New XmlDocument()
    3. xmlDocument.Load(path)
    4. treeView.Nodes.Clear()
    5. XmlRekursivImport(treeView.Nodes, xmlDocument.DocumentElement.ChildNodes)
    6. End Sub
    7. Private Sub XmlRekursivImport(elem As TreeNodeCollection, xmlNodeList As XmlNodeList)
    8. Dim treeNode As TreeNode
    9. For Each myXmlNode As XmlNode In xmlNodeList
    10. treeNode = New TreeNode(myXmlNode.Attributes("value").Value)
    11. If myXmlNode.ChildNodes.Count > 0 Then
    12. XmlRekursivImport(treeNode.Nodes, myXmlNode.ChildNodes)
    13. End If
    14. elem.Add(treeNode)
    15. Next
    16. End Sub


    Lg lris
    Hi...

    Der Node.Tag wird dabei nicht geladen.

    Hab damit schon rumgespielt, aber bisher keinen Erfolg...

    z.B. > geht aber nicht

    VB.NET-Quellcode

    1. Dim treeNode As TreeNode
    2. For Each myXmlNode As XmlNode In xmlNodeList
    3. treeNode = New TreeNode(myXmlNode.Attributes("tag").Value, myXmlNode.Attributes("value").Value)
    4. If myXmlNode.ChildNodes.Count > 0 Then
    5. XmlRekursivImport(treeNode.Nodes, myXmlNode.ChildNodes)
    6. End If
    7. elem.Add(treeNode)
    8. Next


    EDIT:

    So wirds gespeichert- perfekt, aber das auslesen halt...

    XML-Quellcode

    1. <ROOT>
    2. <TreeViewNode value="Kategorie" tag="">
    3. <TreeViewNode value="test2" tag="8PSD" />
    4. <TreeViewNode value="test" tag="9IOV" />
    5. </TreeViewNode>
    6. </ROOT>
    Ein weiterer Ansatz... nur wie bekomme ich das da rein?

    Gebe gleich auf... und bekommt löcher im gehirn...

    VB.NET-Quellcode

    1. Private Sub XmlRekursivImport(elem As TreeNodeCollection, xmlNodeList As XmlNodeList)
    2. Dim treeNode As TreeNode
    3. For Each myXmlNode As XmlNode In xmlNodeList
    4. treeNode = New TreeNode(myXmlNode.Attributes("value").Value)
    5. Dim TNb As TreeNode = New TreeNode(myXmlNode.Attributes("value").Value)
    6. Dim TNt As TreeNode = New TreeNode(myXmlNode.Attributes("tag").Value)
    7. If myXmlNode.ChildNodes.Count > 0 Then
    8. XmlRekursivImport(treeNode.Nodes, myXmlNode.ChildNodes)
    9. End If
    10. elem.Add(treeNode)
    11. Next
    12. End Sub



    EDIT

    Sorry- wollte keinen neuen Beitrag machen- hätte Bearbeiten machen sollen... tut mir leid...!