VB.netでTreeViewの内容をXMLに保存したり読み出したりする
↑のサイトを参考にさせていただきました。
Public Class Form1 Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load TreeView1.Nodes.Add("いち") TreeView1.Nodes(0).Nodes.Add("よん") TreeView1.Nodes(0).Nodes(0).Nodes.Add("ご") TreeView1.Nodes.Add("に") TreeView1.Nodes.Add("さん") TreeView1.ExpandAll() End Sub Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 'TreeViewをXMLに保存する Dim savePath As String = Application.StartupPath & "\TreeView.xml" Dim serializer As New clsTree serializer.SerializeTreeView(Me.TreeView1, savePath) End Sub Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click 'XMLからロードしてTreeViewに展開する Dim loadPath As String = Application.StartupPath & "\TreeView.xml" Dim serializer As New clsTree serializer.DeserializeTreeView(Me.TreeView1, loadPath) End Sub End Class
Imports System Imports System.Xml Imports System.Windows.Forms Imports System.Text Public Class clsTree '// Xml tag for node, e.g. 'node' in case of <node></node> Private Const XmlNodeTag As String = "node" '// Xml attributes for node e.g. <node text="Asia" tag="" '// imageindex="1"></node> Private Const XmlNodeTextAtt As String = "text" Private Const XmlNodeTagAtt As String = "tag" Private Const XmlNodeImageIndexAtt As String = "imageindex" 'Public Sub DeserializeTreeView(ByRef treeView As Windows.Forms.TreeView, ByVal fileName As String) Public Sub DeserializeTreeView(ByRef treeView As TreeView, ByVal fileName As String) Dim reader As XmlTextReader reader = Nothing Try '// disabling re-drawing of treeview till all nodes are added treeView.BeginUpdate() reader = New XmlTextReader(fileName) Dim parentNode As TreeNode parentNode = Nothing While (reader.Read) If reader.NodeType = XmlNodeType.Element Then If reader.Name = XmlNodeTag Then Dim newNode As TreeNode = New TreeNode() Dim isEmptyElement As Boolean = reader.IsEmptyElement '// loading node attributes Dim attributeCount As Integer = reader.AttributeCount If attributeCount > 0 Then Dim i As Integer For i = 0 To attributeCount - 1 reader.MoveToAttribute(i) SetAttributeValue(newNode, reader.Name, reader.Value) Next End If '// add new node to Parent Node or TreeView If (parentNode IsNot Nothing) Then parentNode.Nodes.Add(newNode) Else treeView.Nodes.Add(newNode) End If '// making current node 'ParentNode' if its not empty If (isEmptyElement = False) Then parentNode = newNode End If End If '// moving up to in TreeView if end tag is encountered ElseIf reader.NodeType = XmlNodeType.EndElement Then If reader.Name = XmlNodeTag Then parentNode = parentNode.Parent End If ElseIf (reader.NodeType = XmlNodeType.XmlDeclaration) Then '//Ignore Xml Declaration ElseIf reader.NodeType = XmlNodeType.None Then Exit Sub ElseIf (reader.NodeType = XmlNodeType.Text) Then parentNode.Nodes.Add(reader.Value) End If End While Catch ex As System.Exception Finally '// enabling redrawing of treeview after all nodes are added treeView.EndUpdate() reader.Close() End Try End Sub Private Sub SetAttributeValue(ByRef node As TreeNode, ByVal propertyName As String, ByVal value As String) If propertyName = XmlNodeTextAtt Then node.Text = value ElseIf propertyName = XmlNodeImageIndexAtt Then node.ImageIndex = Integer.Parse(value) ElseIf (propertyName = XmlNodeTagAtt) Then node.Tag = value End If End Sub Public Sub SerializeTreeView(ByRef TreeView As TreeView, ByVal fileName As String) Dim textWriter As New XmlTextWriter(fileName, System.Text.Encoding.Unicode) textWriter.WriteStartDocument() textWriter.WriteStartElement("TreeView") SaveNodes(TreeView.Nodes, textWriter) textWriter.WriteEndElement() textWriter.Close() End Sub Private Sub SaveNodes(ByRef nodesCollection As TreeNodeCollection, ByRef textWriter As Xml.XmlTextWriter) Dim i As Integer For i = 0 To nodesCollection.Count - 1 Dim node As TreeNode = nodesCollection.Item(i) textWriter.WriteStartElement(XmlNodeTag) textWriter.WriteAttributeString(XmlNodeTextAtt, node.Text) textWriter.WriteAttributeString(XmlNodeImageIndexAtt, node.ImageIndex.ToString()) If node.Tag IsNot Nothing Then textWriter.WriteAttributeString(XmlNodeTagAtt, node.Tag.ToString()) If node.Nodes.Count > 0 Then SaveNodes(node.Nodes, textWriter) End If textWriter.WriteEndElement() Next End Sub End Class
保存されたXMLをブラウザで開いてみたら以下のような感じになる
<?xml version="1.0" encoding="UTF-16"?> -<TreeView> -<node imageindex="-1" text="いち"> -<node imageindex="-1" text="よん"> <node imageindex="-1" text="ご"/> </node> </node> <node imageindex="-1" text="に"/> <node imageindex="-1" text="さん"/> </TreeView>