2009年給公司做了個管理系統,裏面用到了TreeView,數據有1500多條,加載要10秒鐘左右
秉着有問題,就要解決,尤其是像這種幾十人、上百人使用的系統。
後來使用登錄時加載數據,登錄後再使用就Clone()的解決方案,感覺不錯。不過,每次調試程序時得等半天,實在不爽。
前些天看到“序列化”這個概念,大意就是把對象保存爲一個文件,下次再使用時,反序列化一下就OK了,第二天一大早到公司立馬做了個Demo,哇,不錯,非常之不錯,使用此方法後,根本沒有延遲的現象。今天終於應用到這個項目中了,同志們再也不用等那10秒了。
以上是背景,將其上雜亂的代碼進行整理,得到整理好的對Table、TreeView序列化的類,版本1.0。
using System; using System.IO; using System.Windows.Forms; using System.Runtime.Serialization.Formatters.Binary; using System.Data; namespace DBFSR.HRDRW { /// <summary> /// 對TreeView,DataTable 對象進行序列化的存儲 /// /// Usage: /// 反序列化:SerializeTree.TreeViewDataAccess.LoadTreeViewData(treeView1,"C:\\treeview.txt"); /// 序列化: SerializeTree.TreeViewDataAccess.SaveTreeViewData(treeView1,"C:\\treeview.txt"); /// </summary> class TreeView_Serialize { public TreeView_Serialize() { } [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> /// 彈出TreeView /// </summary> /// <param name="tv"></param> public void PopupTree(TreeView tv) { if (this.Nodes == null || this.Nodes.Length == 0) { return; } tv.BeginUpdate(); for (int i = 0; i <= this.Nodes.Length - 1; i++) { tv.Nodes.Add(this.Nodes[i].GetTreeNodes()); } tv.EndUpdate(); } } /// <summary> /// 對TreeNode數據對象進行序列化 /// </summary> [Serializable()] public struct TreeNodeData { public string m_strText; public int m_nImageIndex; public int m_nSelectedImageIndex; public bool m_bChecked; public bool m_bExpanded; public object m_Tag; public TreeNodeData[] m_Nodes; /// <summary> /// TreeNode構造函數 /// </summary> /// <param name="tn">傳入初始化內容</param> public TreeNodeData(TreeNode tn) { this.m_strText = tn.Text; this.m_nImageIndex = tn.ImageIndex; this.m_nSelectedImageIndex = tn.SelectedImageIndex; this.m_bChecked = tn.Checked; this.m_bExpanded = tn.IsExpanded; this.m_Nodes = new TreeNodeData[tn.Nodes.Count]; if ((!(tn.Tag == null)) && tn.Tag.GetType().IsSerializable) this.m_Tag = tn.Tag; else this.m_Tag = null; if (tn.Nodes.Count == 0) return; for (int i = 0; i <= tn.Nodes.Count - 1; i++) m_Nodes[i] = new TreeNodeData(tn.Nodes[i]); } /// <summary> /// 返回TreeNode數據 /// </summary> /// <returns></returns> public TreeNode GetTreeNodes() { TreeNode ToTreeNode = new TreeNode(this.m_strText, this.m_nImageIndex, this.m_nSelectedImageIndex); ToTreeNode.Checked = this.m_bChecked; ToTreeNode.Tag = this.m_Tag; if (this.m_bExpanded) { ToTreeNode.Expand(); } if (this.m_Nodes == null && this.m_Nodes.Length == 0) { return null; } if (ToTreeNode != null && this.m_Nodes.Length == 0) { return ToTreeNode; } for (int i = 0; i <= this.m_Nodes.Length - 1; i++) { ToTreeNode.Nodes.Add(this.m_Nodes[i].GetTreeNodes()); } return ToTreeNode; } } /// <summary> /// 加載TreeView /// </summary> /// <param name="treeView"></param> /// <param name="path"></param> public static void LoadTreeViewData(TreeView treeView, string path) { BinaryFormatter bfmter = new BinaryFormatter(); Stream file = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read); TreeViewData treeData = ((TreeViewData)(bfmter.Deserialize(file))); treeData.PopupTree(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(); } } /// <summary> /// 序列化,及反序列化DataTable /// </summary> class DataTable_Serialize { public static DataTable LoadDataTable(string path) { BinaryFormatter ser = new BinaryFormatter(); Stream file = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read); DataTable dt = (DataTable)ser.Deserialize(file); file.Close(); return dt; } public static void SaveDataTable(DataTable dt, string path) { BinaryFormatter ser = new BinaryFormatter(); Stream file = new FileStream(path, FileMode.Create); ser.Serialize(file, dt); file.Close(); } } }