妳是指“新增”組名的時候,也就是樹結構改變時依然能保持當前的選中狀態麽?(當然新增的組內的子節點是不需要選中的)
如果是指這個問題,那麽問題就歸結成:如何有條件的保存和恢復樹節點的選中狀態。
我們知道樹的每壹個節點都是有路徑(FullPath屬性)的,路徑能夠指示完整的樹結構。路徑的默認格式是 節點Text\節點Text\……,如果妳沒有修改路徑分隔符的話。
OK,那麽我們來寫壹個小小的輔助類來幫助保存和恢復樹節點的選中狀態。
public?class?TreeStatusLoader{
TreeView?tv;
Dictionary<string,?bool>?treeStatusDic?=?new?Dictionary<string,?bool>();
public?TreeStatusLoader(TreeView?tv)
{
this.tv?=?tv;
}
public?void?SaveTreeStatus()
{
treeStatusDic.Clear();
SaveTreeStatus(tv.Nodes);
}
private?void?SaveTreeStatus(TreeNodeCollection?nodes)
{
foreach?(TreeNode?tn?in?nodes)
{
if?(!treeStatusDic.ContainsKey(tn.FullPath))
treeStatusDic.Add(tn.FullPath,?tn.Checked);
SaveTreeStatus(tn.Nodes);
}
}
public?void?LoadTreeStatus()
{
LoadTreeStatus(tv.Nodes);
}
private?void?LoadTreeStatus(TreeNodeCollection?nodes)
{
foreach?(TreeNode?tn?in?nodes)
{
if?(treeStatusDic.ContainsKey(tn.FullPath))
tn.Checked?=?treeStatusDic[tn.FullPath];
LoadTreeStatus(tn.Nodes);
}
}
}
該類實際上遍歷了所有節點,保存了其FullPath和Checked屬性以便恢復。用了壹點點遞歸。
最後要指出壹點,FullPath使用的是節點的Text值,它被我用作字典的鍵,如果妳不幸在樹的某壹級上有同Text的節點,請自己提供壹個合適的唯壹的鍵(比如將FullPath的每壹個Text換成Name,或者自己給節點提供唯壹的Tag作為標識)。
使用很簡單,
TreeStatusLoader tsl=new TreeStatusLoader(treeview1);
tsl.SaveTreeStatus();
tsl.LoadTreeStatus();