VB.netでTreeViewの内容をXMLに保存したり読み出したりする

kazufusa0821.livedoor.blog

www.codeproject.com

↑のサイトを参考にさせていただきました。

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>