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

 

你可能感兴趣的:(treeview)