要存儲一個類型,序列化是最簡單的一種實現方式,TreeView本省並不支持序列化,但是TreeNode支持,因此需要從TreeNode下手, 所有序列化TreeVIEw其實就是序列化TreeNode.
1. 自定義一個類SerialzeTreeNode繼承TreeNode繼承並實現ISerializable接口,其實TreeNode已經實現了ISerializable接口,在實現這個接口時要調用基類TreeNode的Serialize函數,要不然序列化的節點會不全,在Serialize函數中添加自己的序列化邏輯,
2. 重寫所有的TreeNode構造函數,特別是與序列化有關的那個構造函數,public TreeNode(SerializationInfo serinfo, StreamingContext context)就是這個了,要不然就不能正確的反序列化了
3. 有可能的話實現一個IDeserializationCallback接口,以便於在反序列化後初始化一些變量之類的動作,因為,反序列化只調用反序列化的那個構造函數.
4. 添加泛型支持,其實也可以用Tab用來存儲要序列化的值,但是Tab是object的,不是很好,因此增加一個泛型
變量是很有意義的,這樣便於強化類型也能夠很好的利用IDE的智能感知功能.
public class SerializTreeNode<T>:TreeNode,ISerializable
{
public T TTag;
}
5. 如果要使用小圖標的話還要做些工作,雖然查看反序列化中的數據,有ImageSelectedIndex項,但是卻無效,因此在實現ISerializable接口中順便把ImageSelectedIndex屬性也序列化進去,然後在反序列化的時候設置其值,這樣就可以保存其圖片索引了.Key與Index沖突,只能一個有效,因此可以二選一,看TreeVIEw是如何設置圖片的了.
6. 對自定義類加上Serializable可序列化標記,要不然都正確了還是無法正確工作的.,同時泛型的那個類也必須要標記為Serializable,否則也會出錯.
7. 擴展TreeVIEw提供序列化和反序列化的函數以保存樹節點和加載保存的樹節點.
public interface ISerializeTreeVIEw
{
bool SaveTreeVIEw(string filename);
bool LoadTreeVIEw(string filename);
}
可以定義這樣的一個接口