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


    附件

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

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

     

    //加载

      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
  • 相关阅读:
    Android,资料分享(2015 版)
    Http请求与响应
    SpringMVC + Spring 3.2.14 + Hibernate 3.6.10 集成详解
    ORA-14402: 更新分区关键字列将导致分区的更改
    Android Service的生命周期
    Android Service基础
    Android Intent 基本使用及对象构成
    Sublime Text3 个人使用心得
    深入了解line-height
    overflow之锚点技术实现选项卡
  • 原文地址:https://www.cnblogs.com/xe2011/p/3443527.html
Copyright © 2020-2023  润新知