樹形控件TreeView的序列化
2024-07-21 02:16:04
供稿:網(wǎng)友
最近自己做了一個小軟件,一個文件瀏覽器,與windows的資源管理器相比,可以查看文件內(nèi)容,而不用外部程序打開,支持多種文件格式,以后準備加入基于內(nèi)容的搜索(打算用開源的dotlucene組件)。其中需要將樹形控件序列化,查了很多資料,在codeproject找到一個vb.net寫的,找了一個代碼轉換器轉成了c#,修改了一下,改成了二進制序列化。貼在下面供需要的參考。
原文地址:
http://www.codeproject.com/vb/net/treeviewdataaccess.asp
我修改過的c#源碼:
using system;
using system.io;
using system.windows.forms;
using system.runtime.serialization.formatters.binary;
namespace testall
{
/// <summary>
/// treeview串行化類
/// </summary>
public class treeviewdataaccess
{
public treeviewdataaccess(){}
/// <summary>
/// treeviewdata
/// </summary>
[serializable()]
public struct treeviewdata
{
public treenodedata[] nodes;
/// <summary>
/// 遞歸初始化treeview數(shù)據(jù)
/// </summary>
/// <param name="treeview"></param>
public treeviewdata(treeview treeview)
{
nodes = new treenodedata[treeview.nodes.count];
if (treeview.nodes.count == 0)
{
return;
}
for (int i = 0; i <= treeview.nodes.count - 1; i++)
{
nodes[i] = new treenodedata(treeview.nodes[i]);
}
}
/// <summary>
/// 通過treeviewdata彈出treeview
/// </summary>
/// <param name="treeview"></param>
public void populatetree(treeview treeview)
{
if (this.nodes == null || this.nodes.length == 0)
{
return;
}
treeview.beginupdate();
for (int i = 0; i <= this.nodes.length - 1; i++)
{
treeview.nodes.add(this.nodes[i].totreenode());
}
treeview.endupdate();
}
}
/// <summary>
/// treenodedata
/// </summary>
[serializable()]
public struct treenodedata
{
public string text;
public int imageindex;
public int selectedimageindex;
public bool checked;
public bool expanded;
public object tag;
public treenodedata[] nodes;
/// <summary>
/// treenode構造函數(shù)
/// </summary>
/// <param name="node"></param>
public treenodedata(treenode node)
{
this.text = node.text;
this.imageindex = node.imageindex;
this.selectedimageindex = node.selectedimageindex;
this.checked = node.checked;
this.expanded = node.isexpanded;
this.nodes = new treenodedata[node.nodes.count];
if ((!(node.tag == null)) && node.tag.gettype().isserializable)
{
this.tag = node.tag;
}
else
{
this.tag = null;
}
if (node.nodes.count == 0)
{
return;
}
for (int i = 0; i <= node.nodes.count - 1; i++)
{
nodes[i] = new treenodedata(node.nodes[i]);
}
}
/// <summary>
/// treenodedata返回treenode
/// </summary>
/// <returns></returns>
public treenode totreenode()
{
treenode totreenode = new treenode(this.text, this.imageindex, this.selectedimageindex);
totreenode.checked = this.checked;
totreenode.tag = this.tag;
if (this.expanded)
{
totreenode.expand();
}
if (this.nodes == null && this.nodes.length == 0)
{
return null;
}
if(totreenode != null && this.nodes.length == 0)
{
return totreenode;
}
for (int i = 0; i <= this.nodes.length - 1; i++)
{
totreenode.nodes.add(this.nodes[i].totreenode());
}
return totreenode;
}
}
/// <summary>
/// 加載treeview
/// </summary>
/// <param name="treeview"></param>
/// <param name="path"></param>
public static void loadtreeviewdata(treeview treeview, string path)
{
binaryformatter ser = new binaryformatter();
stream file = new filestream(path,filemode.open,fileaccess.read,fileshare.read);
treeviewdata treedata = ((treeviewdata)(ser.deserialize(file)));
treedata.populatetree(treeview);
file.close();
}
/// <summary>
/// 保存treeview到文件
/// </summary>
/// <param name="treeview"></param>
/// <param name="path"></param>
public static void savetreeviewdata(treeview treeview, string path)
{
binaryformatter ser = new binaryformatter();
stream file = new filestream(path,filemode.create);
ser.serialize(file,new treeviewdata(treeview));
file.close();
}
}
}