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 ...
随机推荐
- HBase安装inAction
在安装Hbase之前,需要有hadoop的运行环境,关于hadoop的安装过程,请查看我之前的blog:hadoop安装笔记:或者另一个博主的超详细文章http://weixiaolu.iteye.c ...
- (00)Java编程思想开篇立言。
从今天开始,在相当长的时间中我在看Java编程思想.也把这个博客作为开始.这就是一个读书的笔记.
- 单片机系统与标准PC键盘的接口模块设计
转自单片机系统与标准PC键盘的接口模块设计 概述 在单片机系统中,当输入按键较多时,在硬件设计和软件编程之间总存在着矛盾.对于不同的单片机系统需要进行专用的键盘硬件设计和编程调试,通用性差,使 ...
- python代码优化技巧
转自:http://www.douban.com/group/topic/31478102/ 这个资料库还有些不错的好文章: http://www.ibm.com/developerworks/cn/ ...
- 17.1.2 Replication Formats
17.1.2 Replication Formats 复制格式 17.1.2.1 Advantages and Disadvantages of Statement-Based and Row-Bas ...
- bzoj1179
这种tarjan+dp的水题我竟然还WA了两次,要小心! type link=^node; node=record po:longint; next:link; ...
- SQL Server 2008 R2 制作数据库结构和数据脚本
数据库中包含众多表和数据,有时候需要创建脚本将表结构和数据一起导出 具体方法如下: 1.右键选择数据库,选择“任务”--->“生成脚本” 2.根据需求,选择制作脚本的对象,一般情况选择“表” 3 ...
- ARC模式下的单例写法
// 单例 + (id)sharedInstance { __strong static id sharedObject = nil; static dispatch_once_t onceToken ...
- Eclipse&Spring开发开发环境配置
下载Eclipse,打开http://www.eclipse.org/downloads/,选择J2EE开发版: 根据操作系统选择32位还是64位. 开发工具:SpringSource Tool Su ...
- Normal Vector Using WorldInverseTranspose
shader里面经常看到normal向量是用WorldInverseTranspose矩阵做变换的,有时候也可以用WorldMatrix变换. 原理: If your object is only e ...