树形控件TreeView的序列化

treeview|控件

最近自己做了一个小软件,一个文件浏览器,与windows的资源管理器相比,可以查看文件内容,而不用外部程序打开,支持多种文件格式,以后准备加入基于内容的搜索(打算用开源的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数据
   /// </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构造函数
   /// </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();

  }
 }

 
}

时间: 2024-10-30 04:24:56

树形控件TreeView的序列化的相关文章

基于MVC5和Bootstrap的jQuery TreeView树形控件(二)之数据支持json字符串、list集合_jquery

在上篇给大家介绍了基于MVC5和Bootstrap的jQuery TreeView树形控件(一)之数据支持json字符串.list集合. 这种方式其实还是利用list集合的方式传给前台,只不过在前台做了一些小小的变化,而控制器代码也进行了部分的优化,值的一提的是:没用的ajax前后台交互舍弃掉了. 控制器代码如下: //实例化公共静态字典表集合 public static List<TC_DictionaryInfo> DInfo = new List<TC_DictionaryInfo

基于MVC5和Bootstrap的jQuery TreeView树形控件(一)之数据支持json字符串、list集合_jquery

本文支持两种方式的数据,一种为List集合,一种为json字符串. 先来介绍一下后台返回list集合(推荐使用此方法): 控制器代码如下: public static List<TC_DictionaryInfo> DInfo = new List<TC_DictionaryInfo>(); /// <summary> /// TreeView视图 /// </summary> /// <returns></returns> publ

求MVC中实现树形控件的方式或者源码

问题描述 求MVC中实现树形控件的方式或者源码 解决方案 解决方案二:用jquery解决方案三:asp.netMVC下TreeView使用demo,请参考:解决方案四:推荐z-Tree解决方案五:可以用TelerikforMVC的扩展组件,比较方便.有开源GPL授权协议.解决方案六:推荐Dtree

Android树形控件绘制方法

前言 作为一个开发者,日常会接触到很多优秀的软件,其实,或多或少会有这样的想法,我能不能开发一个自己软件,甚至办公软件都希望是Markdown的文本,为何用office?我常常想自己做一个IDE什么的.但是,很多只是想了一下就过了,一直没有实现. 我接触思维导图软件已经很久的了,开始是使用微软的思维导图软件,接着XMind,后来使用了MindMaple Lite.感觉很好用的.也想过如何去实现一个思维导图的软件,加之我特别注意软件的快捷键,我选取软件常常是,看快捷如何,快捷键差的就不要了.基于自

JavaScript面向对象技术实现树形控件

javascript|对象|控件 树形控件是一种人们熟悉的用户界面控件,广泛地用来显示层次型数据. 树形控件具有独特的扩展和折叠分支的能力,能够以较小的空间显示出大量的信息,一目了然地传达出数据之间的层次关系.凡是熟悉图形用户界面的用户,都能够自如地运用树形控件. 图一:用JavaScript实现的树形控件 HTML本身不支持树形控件,但我们可以通过一些JavaScript脚本代码实现.为了提高控件的可重用性,我们要充分运用JavaScript对面向对象编程技术的支持.本文的树形控件适用于IE

教你如何使用JSP面向对象web编程技术实现树形控件

js|web|编程|对象|控件 树形控件是一种人们熟悉的用户界面控件,广泛地用来显示层次型数据. 树形控件具有独特的扩展和折叠分支的能力,能够以较小的空间显示出大量的信息,一目了然地传达出数据之间的层次关系.凡是熟悉图形用户界面的用户,都能够自如地运用树形控件. 图一:用java script实现的树形控件 HTML本身不支持树形控件,但我们可以通过一些java script脚本代码实现.为了提高控件的可重用性,我们要充分运用java script对面向对象编程技术的支持.本文的树形控件适用于I

mfc-MFC 组合框下拉弹出树形控件该怎么实现,自己菜鸟一个

问题描述 MFC 组合框下拉弹出树形控件该怎么实现,自己菜鸟一个 组合框控件和树形控件都能单独实现,就是将两者结合起来不知道怎么弄 解决方案 MFC组合控件的一个小问题 解决方案二: 可以捕获下拉点击事件,然后把树形控件移动过去,显示出来,这样实现简单点 解决方案三: 把树形框放到另外一个无边框窗口里,单击组合框时创建窗口移动过去

MFC 树形控件CTreeCtrl显示文件路径及文件

在上篇文章中简单讲述了"MFC单文档分割窗口显示图片",但是我想实现的是左边显示图片的路径,右边显示图片的情况,所以这里需要讲述如何使用控件List Control和Tree Control.    CListCtrl(列表控件):可以用大图标.小图标.列表.报表四种不同方式显示一组信息.    CTreeCtrl(树形控件):用树结构显示一组信息,并能反映这些信息的层次关系.首先声明:该文章主要是数字图形处理知识并结合liujiannan_1987的上传资源讲述,在此感谢该作者:ht

不知道怎么在列表框中显示树形控件节点的信息(包括书名,作者.....)?

问题描述 不知道怎么在列表框中显示树形控件节点的信息(包括书名,作者.....)? 解决方案 用CTreeCtrl控件,你拿到TVN_SELCHANGED对应的信息后,就可以显示了.可以参考下面例子 void CMFC_TreeCRTLDlg::OnSelchangedTree1(NMHDR* pNMHDR, LRESULT* pResult) { NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR; // TODO: Add your control