附件
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 ...
随机推荐
-
ASP.NET MVC的运行机制--url的全局分析
全局 首先我们来看一副图片 首先,用户通过Web浏览器向服务器发送一条url请求,这里请求的url不再是xxx.aspx格式,而是http://HostName/ControllerNam ...
-
在EF4.1的DBContext中实现事务处理(BeginTransaction)和直接执行SQL语句的示例
在EF4.1的DBContext中实现事务处理(BeginTransaction)和直接执行SQL语句的示例 (2012-03-13 10:12:48) 转载▼ public ActionResu ...
-
Leetcode: Implement Trie (Prefix Tree) &;&; Summary: Trie
Implement a trie with insert, search, and startsWith methods. Note: You may assume that all inputs a ...
-
FOJ2022车站 线段树区间合并
http://acm.fzu.edu.cn/problem.php?pid=2022 刚开始MLE,用map对应,果断爆内存了,然后改用去重,离散化, lowbound查找元素位置,速度还不错,不过p ...
-
层模型--固定定位(position:fixed)
fixed:表示固定定位,与absolute定位类型类似,但它的相对移动的坐标是视图(屏幕内的网页窗口)本身. 由于视图本身是固定的,它不会随浏览器窗口的滚动条滚动而变化,除非你在屏幕中移动浏览器窗口 ...
-
java中多态的使用
一.动手动脑 public class ParentChildTest { public static void main(String[] args) { Parent parent=new Par ...
-
[模板] 积性函数 &;&; 线性筛
积性函数 数论函数指的是定义在正整数集上的实或复函数. 积性函数指的是当 \((a,b)=1\) 时, 满足 \(f(a*b)=f(a)*f(b)\) 的数论函数. 完全积性函数指的是在任何情况下, ...
-
SQL动态长度行列转置
一,案列问题描述: 某销售系统中,注册的用户会在随后的月份中购物下单,需要按月统计注册的用户中各个月下单的金额.源数据表如下: FM::注册月份,CM: 下单月份, AMT:下单金额 期望得到如下统计 ...
-
Codeforces Round #437 C. Ordering Pizza
题意: n个人吃披萨,总共有两种披萨,每种披萨都是有S块,给出每个人要吃的块数,吃第一种披萨能获得的happy值,吃第二种披萨能获得的happy值,问你,在购买的披萨数最少的情况下能获得的最大的总的h ...
-
(4.6)mysql备份还原——深入解析二进制日志(2)binlog参数配置解析
关键词:binlog配置,binlog参数,二进制日志配置,二进制文件参数配置 关键词:binlog缓存,binlog 刷新 0.bin写入流程 写binlog流程如下:# 数据操作buffer po ...