作為一個常用的的Control,TreeView控制項給了我們很多的展現層次資料來源的能力,其強大的定製性和易用性,非常受用戶端應用程式開發人員們的親萊。不過在展現樹形控制項前面的CheckBox控制項的狀態時,我們有時或者需要遍曆整棵樹來得到所有的CheckBox的設定狀態。
在範例程式碼之前,我們先來展示一下相關的類型:
1、 TreeView類
public class TreeView : Control{
//設定樹中的CheckBox的選中之前和之間觸發的事件
public event TreeViewEventHandler AfterCheck;
public event TreeViewCancelEventHandler BeforeCheck;
//設定CheckBoxes啟用狀態,代碼級使用
public bool CheckBoxes { get; set; }
//得到當前子節點的最高層的父結點
public TreeNode TopNode { get; set; }
}
2、 TreeNode類:
public class TreeNode : MarshalByRefObject, ICloneable, ISerializable{
//當前結點的CheckBox狀態
public bool Checked { get; set; }
//附加特殊資訊
public object Tag { get; set; }
//遍曆結點鏈表的屬性
public TreeNode PrevNode { get; }
public TreeNode FirstNode { get; }
public TreeNode NextNode { get; }
}
現在我們就可以通過上面這兩個類提供的相關的屬性和方法來操作TreeView中的CheckBox了。
意圖:
我們要得到所有的選中的CheckBox的資訊。這裡我們為了使用的方便,我們在TreeView的結點中用Tag來附加了CheckBox是否選中的標識資訊。
關鍵步驟分解:
1、 添加AfterCheck事件以設定TreeNode的CheckBox狀態
如果使用者選中CheckBox就設定TreeNode的Tag為“True”,否則置為空白,代碼如:
Private void nodeTree_AfterCheck(object sender, TreeViewEventArgs e){
TreeNode node = e.Node;
if (node.Tag== null)
node.Tag = tag;//附加結點資訊
else
node.Tag = null;
}
2、 搜尋TreeView的根結點
由於TreeView的TopNode屬性可以得到當前選中結點的頂級結點,所以我們可以通過它向前遍曆而得到根結點,代碼如:
TreeNode node= nodeTree.TopNode;//得到TreeView的根結點,注意根結點只有一個
//每次搜尋到根結點
while (node.PrevNode != null)
node = node.PrevNode;
3、 遍曆所有的樹結點,以期得到相應的狀態
這裡為了樣本的方便我們沒有採用從資料庫中擷取資料的方式,而在用了內建的XML資料來源,而且為了顯示狀態我們以MessageBox的方式來呈現結果給使用者。【這裡採用了樹的遞迴演算法】相關代碼如下:
遍曆方法
private void TraversNodes(TreeNode parent){
TreeNode node = parent;
if (node != null){
if(node.Tag !=null&&node.Tag.ToString ()==tag )
nodesTag.AppendFormat("node:{0} has checked\n", node.Name);
//對樹進行遞迴遍曆
if(node.FirstNode !=null ){
TraversNodes(node.FirstNode);
}
if (node.NextNode !=null ){
TraversNodes(node.NextNode);
}
}
}
結果
提示:
這裡只是對TreeView這處內建控制項的遍曆演算法一種相對簡單的樣本,因為在網上沒有找到相關的資料,所以寫出來給需要的朋友一個參考。範例程式碼