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 > )
{
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展开的状态的更多相关文章
- delphi 保存 和 打开 TREE VIEW的节点已经展开的状态
保存 和 打开 TREE VIEW的节点已经展开的状态 如果每次打开后能自动读取上次展开的状态就会非常快捷 下载地址: 实现方法 将已经展开的节点索引 放在一个文本中最后选中的那个节点索引放在最后一位 ...
- iOS 保存、读取与应用状态
固化 对于大多数iOS应用,可以将其功能总结为:提供一套界面,帮助用户管理特定的数据.在这一过程中,不同类型的对象要各司其职:模型对象负责保存数据,视图对象负责显示数据,控制器对象负责在模型对象与视图 ...
- 【转】基本数据持久性(一) 使用plist保存和读取数据
原文网址:http://www.it165.net/pro/html/201309/7170.html 想保存成绩.记录得分.保存账号密码等等?数据持久性可以做到这一点!这篇文章通过简单的程序,来分享 ...
- Protobuf for Python测试保存和读取文件
安装pip, setuptools, and wheel 如果已经从python.org,安装啦Python 2 >=2.7.9 or Python 3 >=3.4 ,那么就已经有啦pip ...
- [MISS静IOS开发原创文摘]-AppDelegate存储全局变量和 NSUserDefaults standardUserDefaults 通过模型保存和读取数据,存储自定义的对象
由于app开发的需求,需要从api接口获得json格式数据并保存临时的 app的主题颜色 和 相关url 方案有很多种: 1, 通过AppDelegate保存为全局变量,再获取 2,使用NSUSerD ...
- java如何操作注册表(Preferences类)(在windows的注册表中保存、读取)
我们经常需要将我们的程序运行中的一些信息(比如在选项对话框中的设置)记录下来,以做便再次运行的时候不用再重写填写这些数据.这对改善软件的人机可用性方面是很有用的.比如:数据库监控.日志工具,JDBMo ...
- tensorflow:保存与读取网络结构,参数
训练一个神经网络的目的是啥?不就是有朝一日让它有用武之地吗?可是,在别处使用训练好的网络,得先把网络的参数(就是那些variables)保存下来,怎么保存呢?其实,tensorflow已经给我们提供了 ...
- C# 结构体和List<T>类型数据转Json数据保存和读取
C# 结构体和List<T>类型数据转Json数据保存和读取 一.结构体转Json public struct FaceLibrary { public string face_name ...
- 10 Tensorflow模型保存与读取
我们的模型训练出来想给别人用,或者是我今天训练不完,明天想接着训练,怎么办?这就需要模型的保存与读取.看代码: import tensorflow as tf import numpy as np i ...
随机推荐
- php自学笔记1
PHP(Personal Home Page的缩写,现已更名Hypertext Preprocessor“超文本预处理器”)静态web开发:html,内容一成不变动态web开发: php(Zend). ...
- UIPageControll - 图片格式
设置pageCon的显示风格: 1. 颜色 page.pageIndicatorTintColor = [UIColor redColor]; page.currentPageIndicatorTin ...
- 关于BootStrap下图标的显示问题
我现在在做自己的毕业设计,用到了bootstrap的这一套css样式,说句心里话,这一套东西确实很好用,但是一个小问题足足浪费了我将近两个小时. 我的问题是:没有办法使用bootstrap下的图标(很 ...
- ABAP写的一个递归
需求:计算下面树形结构中每个子节点与最上层父节点的对应关系. DATA:BEGIN OF lt_ztab OCCURS 0, a TYPE string, b TYPE str ...
- settimeout vs setinternal
http://blog.sina.com.cn/s/blog_6b1ab3be0100pzmo.html http://www.360doc.com/content/11/0412/17/100779 ...
- angularJS vs backbone
http://alistapart.com/article/javascript-mvc http://blog.nebithi.com/backbone-and-angular-demystifyi ...
- go网络编程示例,客户端,服务器端
http://blog.csdn.net/wangningyu/article/details/22859245 http://blog.csdn.net/wangningyu/article/det ...
- 更好的 SQL 模式的 10 条规则
更好的 SQL 模式的 10 条规则 2015-06-17 11:57:392353浏览1评论 在创建新表和数据仓库时,要做很多决定.一些在当时似乎无关紧要的地方,却让你和用户在数据库的生命期内感到痛 ...
- Learing WCF Chapter1 WCF Services
WCF ServicesWCF services are the new distributed boundary in an enterprise application—with an empha ...
- qt容器在并发时需要注意的地方
最近用tbb和qt写了一个延时摄影后期控制镜头的工具,主要就是扫描目录下所有图片,按照给定参数截取图片中某区域并另存,模拟镜头摆动. 扫描后的图片路径保存在qlist内,作为只读数据,交由tbb的pa ...