附件

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 > )
{
for (int i = ; 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 = ; 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 > )
{
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 > )
{
text.Append(" ( ");
for (int i = ; i < attributeCount; i++)
{
if (i != ) 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

C# 保存和读取TreeView展开的状态的更多相关文章

  1. delphi 保存 和 打开 TREE VIEW的节点已经展开的状态

    保存 和 打开 TREE VIEW的节点已经展开的状态 如果每次打开后能自动读取上次展开的状态就会非常快捷 下载地址: 实现方法 将已经展开的节点索引 放在一个文本中最后选中的那个节点索引放在最后一位 ...

  2. iOS 保存、读取与应用状态

    固化 对于大多数iOS应用,可以将其功能总结为:提供一套界面,帮助用户管理特定的数据.在这一过程中,不同类型的对象要各司其职:模型对象负责保存数据,视图对象负责显示数据,控制器对象负责在模型对象与视图 ...

  3. 【转】基本数据持久性(一) 使用plist保存和读取数据

    原文网址:http://www.it165.net/pro/html/201309/7170.html 想保存成绩.记录得分.保存账号密码等等?数据持久性可以做到这一点!这篇文章通过简单的程序,来分享 ...

  4. Protobuf for Python测试保存和读取文件

    安装pip, setuptools, and wheel 如果已经从python.org,安装啦Python 2 >=2.7.9 or Python 3 >=3.4 ,那么就已经有啦pip ...

  5. [MISS静IOS开发原创文摘]-AppDelegate存储全局变量和 NSUserDefaults standardUserDefaults 通过模型保存和读取数据,存储自定义的对象

    由于app开发的需求,需要从api接口获得json格式数据并保存临时的 app的主题颜色 和 相关url 方案有很多种: 1, 通过AppDelegate保存为全局变量,再获取 2,使用NSUSerD ...

  6. java如何操作注册表(Preferences类)(在windows的注册表中保存、读取)

    我们经常需要将我们的程序运行中的一些信息(比如在选项对话框中的设置)记录下来,以做便再次运行的时候不用再重写填写这些数据.这对改善软件的人机可用性方面是很有用的.比如:数据库监控.日志工具,JDBMo ...

  7. tensorflow:保存与读取网络结构,参数

    训练一个神经网络的目的是啥?不就是有朝一日让它有用武之地吗?可是,在别处使用训练好的网络,得先把网络的参数(就是那些variables)保存下来,怎么保存呢?其实,tensorflow已经给我们提供了 ...

  8. C# 结构体和List<T>类型数据转Json数据保存和读取

    C#  结构体和List<T>类型数据转Json数据保存和读取 一.结构体转Json public struct FaceLibrary { public string face_name ...

  9. 10 Tensorflow模型保存与读取

    我们的模型训练出来想给别人用,或者是我今天训练不完,明天想接着训练,怎么办?这就需要模型的保存与读取.看代码: import tensorflow as tf import numpy as np i ...

随机推荐

  1. Leaflet学习笔记-基础内容

    为什么选择Leaflet 开源,且代码仅有 31 KB,但它具有开发人员开发在线地图的大部分功能(80%的功能) 是不是比arcgis要小很多呢 官网:http://leafletjs.com/ 劣势 ...

  2. Spring之Spring MVC

    Spring调配半天没搞定,原来是web.xml应该放在WEB-INF的目录下,而不是webcontent目录下: java.lang.ClassNotFoundException: org.spri ...

  3. VIM一些常用命令,方法,配置

    配置文件地址 github 工具只是为了更好的工具,选择一种,坚持使用学习记忆,熬过瓶颈期就可以了. 现在我基本大的项目是IDE+vim 插件,写小代码是VIM. 常用的操作,便捷的方法 1.如何选中 ...

  4. bzoj 4031: [HEOI2015]小Z的房间 轮廓线dp

    4031: [HEOI2015]小Z的房间 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 98  Solved: 29[Submit][Status] ...

  5. [转贴]C++调用openssl 的AES加密例子

    #include <stdio.h>#include <string.h>#include <sys/types.h>#include <sys/stat.h ...

  6. SPRING IN ACTION 第4版笔记-第二章-003-以Java形式注入Bean、@Bean的用法

    1. package soundsystem; import org.springframework.context.annotation.Bean; import org.springframewo ...

  7. relink:在Linux/UNIX平台上relink Oracle软件(转)

    当操作系统升级后.操作系统打完补丁后.安装完Oracle补丁之后和relink过程中出现问题时,都会用到relink方法来保证Oracle软件的正常使用.本文介绍一下relink方法的使用.   1. ...

  8. linux VM命令下查找

    使用vi编辑器编辑长文件时,常常是头昏眼花,也找不到需要更改的内容. 这时,使用查找功能尤为重要. 方法如下: 1.命令模式下输入“/字符串”,例如“/Section 3”. 2.如果查找下一个,按“ ...

  9. dom4j修改xml文件

    @SuppressWarnings("unchecked") @Override public void insertCustomInfo(File file, String mo ...

  10. C# 判断某程序是否运行

    [DllImport("user32.dll")] private static extern bool SetForegroundWindow(IntPtr hWnd); [Dl ...