zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    HTTP断点续传 规格严格
    Java Shutdown 规格严格
    linux 命令源码 规格严格
    JTable调整列宽 规格严格
    linux 多CPU 规格严格
    Hello can not find git path 规格严格
    Kill 规格严格
    拜拜牛人 规格严格
    Swing 规格严格
    Debugging hangs in JVM (on AIX but methodology applicable to other platforms) 规格严格
  • 原文地址:https://www.cnblogs.com/xe2011/p/3443527.html
Copyright © 2011-2022 走看看