Treeview nodes extra infos zuordnen

  • VB.NET

Es gibt 37 Antworten in diesem Thema. Der letzte Beitrag () ist von big-d.

    Treeview nodes extra infos zuordnen

    Hey!
    Wie kann ich einer Treeview node "Extrainfos" zuweisen, welche ich auch mitten im Programmlauf ändern kann?

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „big-d“ ()

    Hi
    Einfach eine Klasse von der TreeNode-Klasse erben lassen, die Eigenschaften hinzufügen und statt den TreeNode-Instanzen halt Instanzen der eigenen Klasse hinzufügen. Mit DirectCast(value, MyTreeNode) kannst du dann auf die Nodes zugreifen, wie du auch auf die TreeNode-Instanzen zugreifen kannst.

    Gruß
    ~blaze~
    Du kannst auf MyTreeNodes direkt zugreifen, ohne sie zu casten. Das ist nicht erforderlich.
    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!
    Du musst es schon Public deklarieren und es ist üblich, mit Properties zu arbeiten.

    VB.NET-Quellcode

    1. Public Class myTreeNode
    2. Inherits TreeNode
    3. Private strLool As String
    4. Public Property Lool() As String
    5. Get
    6. Return strLool
    7. End Get
    8. Set(Byval value As String)
    9. strLool = value
    10. End Set
    11. End Property
    12. End Class


    Gruß
    ~blaze~

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „~blaze~“ ()

    ~blaze~ schrieb:

    Public Property Lool() As String

    Das ist eine Property, die kannst Du nach außen verwenden wie eine Variable:

    VB.NET-Quellcode

    1. Lool = "hjhjh"
    2. MessageBox.Show(Lool)
    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!
    Hmm....
    Sorry, ich komm da nicht weiter....
    Ich hab' folgenden Code von blog.bigbasti.com :
    und ich möchte(evtl in der xml Datei das als Property mitpeichern lassen(also nicht als String, der gesplittet werden muss...
    Klasse aus einem Blogpost auf blog.bigbasti.com

    VB.NET-Quellcode

    1. 'Author: Sebastian Gross
    2. 'Web: www.bigbasti.com
    3. 'Blog: blog.bigbasti.com
    4. 'E-mail: kontakt@bigbasti.com
    5. 'XMLParser Version 1.1
    6. 'LIZENZ: Sie können diesen Code gerne in Ihren eigenen Projekten verwenden
    7. 'sowie modifizieren und weiterentwickeln. Gerne können Sie mir auch Wünsche,
    8. 'Änderungen üder Fehler mailen.
    9. 'Ich würde mich freuen wenn Sie mir eine Kurze mail schreiben, und Ihr Projekt
    10. 'beschreiben in dem Sie diesen Code verwenden. Ich würde dann einen Back-Link
    11. 'auf meiner Homepage zu ihrem Projekt erstellen!
    12. 'Für weitere Tipps & Tricks sowie Beispiele besuchen Sie meine o.g. Homepage.
    13. #Region "Changelog"
    14. 'Changelog:
    15. '------------------------------------------------------------------------------
    16. 'v. 1.1 01.09.2009
    17. '------------------------------------------------------------------------------
    18. '* Funktionen zum exportieren & importieren von TreeViews hinzugefügt
    19. '* Funktions-beschreibungen hinzugefügt
    20. '* Regionen hinzugefügt
    21. '* FIX: Die XMLNode Namen werden nun richtig gespeichert und gelesen
    22. '* Funktionsbeschreibungen hinzugefügt
    23. '------------------------------------------------------------------------------
    24. 'v. 1.0 21.08.2009
    25. '------------------------------------------------------------------------------
    26. #End Region
    27. Imports System.IO
    28. Imports System.Xml
    29. Public Class XMLParser
    30. 'Klassenvariablen
    31. '---
    32. Dim writer As XmlWriter
    33. Dim retNode As TreeNode
    34. Dim retTree As TreeView
    35. Dim xmlDoc As New XmlDocument
    36. '---
    37. Public Sub New()
    38. 'Konstruktor wird nicht benötigt
    39. End Sub
    40. ''' <summary>
    41. ''' Speichert eine TreeNode im XML-Format unter dem angegebenen Pfad ab.
    42. ''' </summary>
    43. ''' <param name="trn">Der TreeNode, der abgespeichert werden soll</param>
    44. ''' <param name="path">Der Pfad, unter dem der TreeNode abgespeichert werden soll</param>
    45. Public Sub exportTreeNodeXML(ByVal trn As TreeNode, ByVal path As String)
    46. 'Prüfen, ob Zieldatei bereits exestiert, wenn ja Löschen
    47. If File.Exists(path) Then File.Delete(path)
    48. Dim settings As New XmlWriterSettings()
    49. settings.Indent = True
    50. settings.OmitXmlDeclaration = False
    51. 'Die gewünschte Datei neu erstellen
    52. writer = XmlWriter.Create(path, settings)
    53. With writer
    54. .WriteStartDocument()
    55. .WriteStartElement(XmlConvert.EncodeName(trn.Text))
    56. writeNewTreeNode(trn)
    57. .WriteEndElement()
    58. .WriteEndDocument()
    59. .Close()
    60. End With
    61. End Sub
    62. ''' <summary>
    63. ''' Diese Funktion geht rekursiv durch alle Einträge der TreeNode
    64. ''' </summary>
    65. ''' <param name="startNode">Der TreeNode, in dem nach Weiteren Nodes gescht werden soll</param>
    66. Private Sub writeNewTreeNode(ByVal startNode As TreeNode)
    67. For Each tn As TreeNode In startNode.Nodes
    68. If tn.Nodes.Count < 1 Then
    69. 'Wenn tn ein End-element ist, also keine Unterelemente hat
    70. 'Neues Element erstellen
    71. writer.WriteStartElement(XmlConvert.EncodeName(tn.Text))
    72. 'Weitere Attribute anhängen
    73. '---
    74. 'writer.WriteAttributeString("MeinAttribut", "Wert")
    75. 'Die bezeichnung der node einfügen
    76. 'writer.WriteString(tn.Text)
    77. '---
    78. 'Element schließen
    79. writer.WriteEndElement()
    80. Else
    81. 'Wenn tn ein Node mit unternodes ist
    82. 'Neues Element erstellen
    83. writer.WriteStartElement(XmlConvert.EncodeName(tn.Text))
    84. writeNewTreeNode(tn)
    85. 'Element schließen
    86. writer.WriteEndElement()
    87. End If
    88. Next
    89. End Sub
    90. ''' <summary>
    91. ''' Diese Funktion Liest eine XML-Datei ein und wandelt diese in ein TreeNode um
    92. ''' </summary>
    93. ''' <param name="path">Der Pfad zu der XML-Datei, die in eine TreeNode eingelesen werden soll.</param>
    94. Public Function importTreeNodeXML(ByVal path As String) As TreeNode
    95. 'Try
    96. If File.Exists(path) Then
    97. xmlDoc.Load(path)
    98. Try
    99. 'Lädt man ein altes Default.xml wird es einen Fehler geben
    100. retNode = New TreeNode(XmlConvert.DecodeName(xmlDoc.ChildNodes(1).Name))
    101. Catch ex As Exception
    102. 'Wegen abwärtskompabilität:
    103. retNode = New TreeNode(XmlConvert.DecodeName(xmlDoc.FirstChild.Name))
    104. End Try
    105. readNewTreeNode(retNode.Nodes, xmlDoc.DocumentElement)
    106. End If
    107. 'Catch ex As Exception
    108. 'MessageBox.Show(ex.Message, "XMLParser Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
    109. 'End Try
    110. Return retNode
    111. End Function
    112. ''' <summary>
    113. ''' Diese Funktion geht rekursiv durch alle Einträge der XML-Datei
    114. ''' </summary>
    115. ''' <param name="node">Der Treenode an den die Ausgelesenenen XML-Nodes gehängst werden sollen</param>
    116. ''' <param name="xmln">Die XML-Node aus der die Unterbereiche ausgelesen werden sollen</param>
    117. Private Function readNewTreeNode(ByVal node As TreeNodeCollection, ByVal xmln As XmlNode) As TreeNode
    118. Dim nn As TreeNode
    119. For Each xn As XmlNode In xmln.ChildNodes
    120. If xn.Name.Equals("#text") Then
    121. nn = node.Add(XmlConvert.DecodeName(xn.Value))
    122. Else
    123. nn = node.Add(XmlConvert.DecodeName(xn.Name))
    124. End If
    125. readNewTreeNode(nn.Nodes, xn)
    126. Next
    127. Return nn
    128. End Function
    129. #Region "exportTreeView"
    130. ''' <summary>
    131. ''' Diese Funktion speichert die Angegebene TreeView im XML Format ab
    132. ''' </summary>
    133. ''' <param name="trv">Die TreeView, die als XML Datei exportiert werden soll</param>
    134. ''' <param name="path">Der Pfad, unter dem die XML-Datei gespeichert werden soll</param>
    135. Public Sub exportTreeViewXML(ByVal trv As TreeView, ByVal path As String)
    136. 'Prüfen, ob Zieldatei bereits exestiert, wenn ja Löschen
    137. If File.Exists(path) Then
    138. File.Delete(path)
    139. End If
    140. Dim settings As New XmlWriterSettings()
    141. settings.Indent = True
    142. settings.CheckCharacters = False
    143. settings.ConformanceLevel = ConformanceLevel.Auto
    144. 'Die gewünschte Datei neu erstellen
    145. writer = XmlWriter.Create(path, settings)
    146. 'Da man in einem XML Dokument nicht mehrere Root-Elemente haben kann,
    147. 'eine Treeview aber mehrere enthalten kann müssen wir eine neue Node
    148. 'um die anderen packen, die man beim einlesen wieder entfernen muss
    149. Dim myNode As TreeNode = New TreeNode("rootNode")
    150. For Each n As TreeNode In trv.Nodes
    151. myNode.Nodes.Add(n.Clone)
    152. Next
    153. writer.WriteStartDocument()
    154. With writer
    155. .WriteStartElement(XmlConvert.EncodeName(myNode.Text))
    156. writeNewTreeNode(myNode)
    157. .WriteEndElement()
    158. End With
    159. writer.WriteEndDocument()
    160. writer.Close()
    161. End Sub
    162. ''' <summary>
    163. ''' Diese Funktion lädt eine TreeView aus einer XML-Datei.
    164. ''' </summary>
    165. ''' <param name="trv">Die TreeView, in die die XML-Datei importiert werden soll</param>
    166. ''' <param name="path">Der Pfad, unter dem die XML-Datei gespeichert ist</param>
    167. Public Sub importTreeViewXML(ByVal trv As TreeView, ByVal path As String)
    168. 'Try
    169. If File.Exists(path) Then
    170. xmlDoc.Load(path)
    171. Try
    172. 'Lädt man ein altes Default.xml wird es einen Fehler geben
    173. retNode = New TreeNode(XmlConvert.DecodeName(xmlDoc.ChildNodes(1).Name))
    174. Catch ex As Exception
    175. 'Wegen abwärtskompabilität:
    176. retNode = New TreeNode(XmlConvert.DecodeName(xmlDoc.FirstChild.Name))
    177. End Try
    178. readNewTreeNode(retNode.Nodes, xmlDoc.DocumentElement)
    179. For Each n As TreeNode In retNode.Nodes
    180. trv.Nodes.Add(n)
    181. Next
    182. End If
    183. 'Catch ex As Exception
    184. 'MessageBox.Show(ex.Message, "XMLParser Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
    185. 'End Try
    186. End Sub
    187. #End Region
    188. End Class

    Ich hoffe, ihr könnt mir nochmal helfen, weil ich im Moment echt aufm Schlauch stehe...
    Mfg, big-d
    *[PUSH]*

    Zu oberem Post:

    Ich dachte an eine Art HTML-Syntax...

    Also, dass es im Save-File etwa so aussieht:

    XML-Quellcode

    1. <?xml version="1.0" encoding="utf-8" ?>
    2. - <rootNode>
    3. - <und_x0020_nummer_x0020_5>
    4. <_x002E_..lebt_x0021__x0021__x0021_/>
    5. </und_x0020_nummer_x0020_5>
    6. </rootNode>


    aber dass man auch noch die Eigenschaft Lool (aus den oberen Posts) abspeichern und auslesen kann.
    Schonmal danke für eure Hilfe!
    Ich würde es mal mit XML-Serialisierung versuchen. Wenn du nur deine eigenen Eigenschaften speichern willst, machs halt rekursiv: Importiere System.Xml, erstelle ein XmlDocument, rufe für jeden Knoten des TreeViews eine Methode auf, die die Daten des Knotens speichert und die Methode für jeden Unterknoten aufruft. Schon hast dus gespeichert. Beim Auslesen gehst du halt genau andersrum vor.

    Gruß
    ~blaze~
    Sorry, steh grad' aufm Schlauch :D
    War grade Essen mit Freunden....
    naja, egal!
    Erstmal, Danke für deine Hilfe!
    Aber kann ich das in den obigen Code mit einbauen?
    also dass es in der .xml mit gespeichert wird?
    und man es dann auch wieder auslesen kann?
    naja, alle Möglichkeiten sind recht aufwändig und mindestens so schwer zu erläutern, wie sie zu kapieren sind.
    ZB kannste IMO nicht erwarten, dass wir uns in Blogbastis 200 Zeilen Code einarbeiten, und dein Problem lösen, was du so überaus präzise umschreibst mit: "... komme iwie nicht weiter".

    Ein Teil-Ansatz ist dir gegeben, nämlich eine Treenode-Erweiterung zu verwenden.
    Ich hätte hier noch ein Gerät, mit dem man ungefähr alles, was man will in einen String schieben kann, und auch daraus restaurieren: flexible Settings

    Aber weils eine sehr allgemeingültige Lösung ist, ist das auch nicht einfach zu kapieren.
    Ich hatte ja auch schon eine Idee, weiss aber nicht, wie ich dise umsetzen sollte!

    Habe mich auch oben verschrieben -_-

    DIe Ausgabe ist wie folgt:

    XML-Quellcode

    1. <?xml version="1.0" encoding="utf-8" ?>
    2. - <rootNode>
    3. - <und_x0020_nummer_x0020_5>
    4. <_x002E_..lebt_x0021__x0021__x0021_/>
    5. </und_x0020_nummer_x0020_5>
    6. </rootNode>


    und ich stelle mir es so vor:

    XML-Quellcode

    1. <?xml version="1.0" encoding="utf-8" ?>
    2. - <node=rootNode>
    3. - <node=und_x0020_nummer_x0020_5><lool=xD>
    4. <node=_x002E_..lebt_x0021__x0021__x0021_/><lool=Nyan!>
    5. <node=/und_x0020_nummer_x0020_5><lool=xD>
    6. <node=/rootNode>
    Jeder Node hat bereits eine Eigenschaft für Zusatzinfos.
    Diese nennt sich TAG und ist vom Typ Object..

    Kleines Beispiel:

    VB.NET-Quellcode

    1. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    2. TreeView1.Nodes(0).Tag = New MyInfo With {.DasUndDas = "Root Node oder so"}
    3. End Sub
    4. Private Class MyInfo
    5. Private _dasUnddAs As String
    6. Public Property DasUndDas() As String
    7. Get
    8. Return _dasUnddAs
    9. End Get
    10. Set(ByVal value As String)
    11. _dasUnddAs = value
    12. End Set
    13. End Property
    14. End Class


    Welches Objekt du dem Tag zuweist bleibt dir Überlassen.

    Gruss Mono
    Das ist meine Signatur und sie wird wunderbar sein!