C# 保存和读取TreeView展开的状态

附件

http://files.cnblogs.com/xe2011/ReadAndSaveTreeViewState.rar

保存和读取TreeView展开的状态  节点{ImageIndex,IsExpland,Position,Tag,Text  }

 C# 保存和读取TreeView展开的状态

C# 保存和读取TreeView展开的状态

//加载

  private void buttonLoad_Click(object sender, EventArgs e)
        {
            treeView1.Focus();
            string xmlFileName = "TreeView.xml";
            if (System.IO.File.Exists(xmlFileName))
            {
                WindowsForms.XmlTreeViewState TreeState = new WindowsForms.XmlTreeViewState();
                TreeState.LoadTreeViewState(treeView1, xmlFileName);
            }
        }

写入

  string xmlFileName = "TreeView.xml";
            WindowsForms.XmlTreeViewState TreeState = new WindowsForms.XmlTreeViewState();
            TreeState.SaveTreeViewState(treeView1, xmlFileName);

XmlTreeViewState.CS

完整的类

using System;
using System.Xml;
using System.Windows.Forms;
using System.Text;

//功能
//本代码是在Syed Umar Anis的
//http://www.codeproject.com/Articles/13099/Loading-and-Saving-a-TreeView-control-to-an-XML-fi
//这个代码的基础上进行了修改并增加了能恢复TREEVIEW的展开的状态 和选中最后选择的一项

//1 用XML保存和读取TREE VIEW的状态
//2 将一个XML文件加载到TREEVIEW中
namespace WindowsForms
{
    public class XmlTreeViewState
    {
        public XmlTreeViewState()
        {
        }

        #region const...
        private const string XmlNodeTag = "node";

        /*
         *  <TreeView>
         *     <node  text = "节点1" imageindex = "0" expland = "true" lastselect = "false">
         *        <node  text = "节点2" imageindex = "-1" expland = "true" lastselect = "false"></node>
         *     </node>
         *  </TreeView>
        */
        private const string XmlNodeTextAtt = "text";
        private const string XmlNodeTagAtt = "tag";
        private const string XmlNodeImageIndexAtt = "imageindex";
        private const string XmlNodeExpandState = "expland";//展开状态
        private const string XmlNodeIsSelect = "lastselect";//最后选中的项
        private const string XmlNodeIndex = "index";//当前TreeView索引 
        #endregion

        #region 保存TREEVIEW状态
        public void SaveTreeViewState(TreeView treeView, string fileName)
        {
            XmlTextWriter textWriter = new XmlTextWriter(fileName, System.Text.Encoding.Unicode);
            textWriter.WriteStartDocument();
            textWriter.WriteStartElement("TreeView");
            SaveXmlNodes(treeView.Nodes, textWriter);
            textWriter.WriteEndElement();
            textWriter.Close();
        }
        #endregion

        #region 读取TreeView状态
        public void LoadTreeViewState(TreeView treeView, string fileName)
        {
            XmlTextReader reader = null;
            try
            {
                treeView.Nodes.Clear();
                // disabling re-drawing of treeview till all nodes are added
                treeView.BeginUpdate();
                reader = new XmlTextReader(fileName);


                TreeNode parentNode = null;

                while (reader.Read())
                {
                    if (reader.NodeType == XmlNodeType.Element)
                    {
                        if (reader.Name == XmlNodeTag)
                        {
                            TreeNode newNode = new TreeNode();
                            bool isEmptyElement = reader.IsEmptyElement;

                            // loading node attributes
                            int attributeCount = reader.AttributeCount;
                            if (attributeCount > 0)
                            {
                                for (int i = 0; i < attributeCount; i++)
                                {
                                    reader.MoveToAttribute(i);
                                    SetAttributeValue(newNode, reader.Name, reader.Value);
                                    SetTreeViewState(treeView);
                                }
                            }

                            // add new node to Parent Node or TreeView
                            if (parentNode != null)
                                parentNode.Nodes.Add(newNode);
                            else
                                treeView.Nodes.Add(newNode);

                            // making current node 'ParentNode' if its not empty
                            if (!isEmptyElement)
                            {
                                parentNode = newNode;
                            }
                        }
                    }
                    // moving up to in TreeView if end tag is encountered
                    else if (reader.NodeType == XmlNodeType.EndElement)
                    {
                        if (reader.Name == XmlNodeTag)
                        {
                            parentNode = parentNode.Parent;
                        }
                    }
                    else if (reader.NodeType == XmlNodeType.XmlDeclaration)
                    { //Ignore Xml Declaration                    
                    }
                    else if (reader.NodeType == XmlNodeType.None)
                    {
                        return;
                    }
                    else if (reader.NodeType == XmlNodeType.Text)
                    {
                        parentNode.Nodes.Add(reader.Value);
                    }
                }
            }
            finally
            {
                treeView.EndUpdate();
                reader.Close();
            }
        }
        #endregion

        #region 设置 展开后的节点 最后选中的节点
        private TreeNode LastSelectNode = null;//最后选中的节点
        private TreeNode ExpandNode = null;//展开后的节点

        // Expland LastSelect
        private void SetTreeViewState(TreeView treeView)
        {
            treeView.SelectedNode = ExpandNode;
            //Expland
            if (ExpandNode != null)
                ExpandNode.Expand();

            //Select
            if (LastSelectNode != null)
                treeView.SelectedNode = LastSelectNode;
        }
        #endregion

        #region 保存XML节点
        private void SaveXmlNodes(TreeNodeCollection nodesCollection, XmlTextWriter textWriter)
        {
            for (int i = 0; i < nodesCollection.Count; i++)
            {
                TreeNode node = nodesCollection[i];
                textWriter.WriteStartElement(XmlNodeTag);// "node";

                textWriter.WriteAttributeString(XmlNodeTextAtt, node.Text);// "text";
                textWriter.WriteAttributeString(XmlNodeImageIndexAtt, node.ImageIndex.ToString());//"imageindex";

                if (node.IsExpanded == true)
                    textWriter.WriteAttributeString(XmlNodeExpandState, node.IsExpanded.ToString());////展开状态

                if (node.IsSelected)
                    textWriter.WriteAttributeString(XmlNodeIsSelect, node.IsSelected.ToString());//是否选中

                if (node.Tag != null)
                    textWriter.WriteAttributeString(XmlNodeTagAtt, node.Tag.ToString());

                textWriter.WriteAttributeString(XmlNodeIndex, node.Index.ToString());//Index

                // add other node properties to serialize here

                if (node.Nodes.Count > 0)
                {
                    SaveXmlNodes(node.Nodes, textWriter);
                }
                textWriter.WriteEndElement();
            }
        }
        #endregion

        #region 设置XML属性
        private void SetAttributeValue(TreeNode node, string propertyName, string value)
        {
            if (propertyName == XmlNodeTextAtt) //text
            {
                node.Text = value;
            }
            else if (propertyName == XmlNodeImageIndexAtt) //ImageIndex
            {
                node.ImageIndex = int.Parse(value);
            }
            else if (propertyName == XmlNodeExpandState)
            {
                ExpandNode = node;
            }
            else if (propertyName == XmlNodeIsSelect)
            {
                LastSelectNode = node;
            }
            else if (propertyName == XmlNodeTagAtt)//tag
            {
                node.Tag = value;
            }
            else if (propertyName == XmlNodeIndex)
            {
               // 用来标识 这样看XML文件时结构清晰
            }
        }
        #endregion

        #region 把XML文件读取到TREE中
        public void LoadXmlFileInTreeView(TreeView treeView, string fileName)
        {
            XmlTextReader reader = null;
            try
            {
                treeView.BeginUpdate();
                reader = new XmlTextReader(fileName);

                TreeNode n = new TreeNode(fileName);
                treeView.Nodes.Add(n);
                while (reader.Read())
                {
                    if (reader.NodeType == XmlNodeType.Element)
                    {
                        bool isEmptyElement = reader.IsEmptyElement;
                        StringBuilder text = new StringBuilder();
                        text.Append(reader.Name);
                        int attributeCount = reader.AttributeCount;
                        if (attributeCount > 0)
                        {
                            text.Append(" ( ");
                            for (int i = 0; i < attributeCount; i++)
                            {
                                if (i != 0) text.Append(", ");
                                reader.MoveToAttribute(i);
                                text.Append(reader.Name);
                                text.Append(" = ");
                                text.Append(reader.Value);
                            }
                            text.Append(" ) ");
                        }

                        if (isEmptyElement)
                        {
                            n.Nodes.Add(text.ToString());
                        }
                        else
                        {
                            n = n.Nodes.Add(text.ToString());
                        }
                    }
                    else if (reader.NodeType == XmlNodeType.EndElement)
                    {
                        n = n.Parent;
                    }
                    else if (reader.NodeType == XmlNodeType.XmlDeclaration)
                    {

                    }
                    else if (reader.NodeType == XmlNodeType.None)
                    {
                        return;
                    }
                    else if (reader.NodeType == XmlNodeType.Text)
                    {
                        n.Nodes.Add(reader.Value);
                    }

                }
            }
            finally
            {
                treeView.EndUpdate();
                reader.Close();
            }
        }
        #endregion
    }
}
XmlTreeViewState.CS