1. 程式人生 > WINDOWS開發 >C#:TreeView控制元件實現帶子節點的多選樹結構

C#:TreeView控制元件實現帶子節點的多選樹結構

日常開發中,經常需要實現多選的樹結構,並且可能存在多級節點的情況。

以WinFrom為例,下面是本人的總結。 首先建立一個TreeView 名稱為 tvTest,下面開始新增主子節點。

 1           TreeView tvTest=new TreeView();
 2 
 3            tvTest.BeginUpdate();
 4 
 5             for (int i = 0; i < 5; i++)
 6             {
 7                 TreeNode node = new TreeNode();
 8                 node.Tag = i+1
; 9 node.Text = "父節點"+(i+1).Tostring(); 10 node.Name = "application"; 11 12 //node.ImageIndex = 1; 13 //node.SelectedImageIndex = 1; 14 15 tvTest.Nodes.Add(node); 16 17 for (int j = 0; j < 4; j++) 18 {
19 TreeNode childNode = new TreeNode(); 20 childNode.Tag = "子節點" + (j + 1).ToString(); 21 childNode.Text = "子節點" + (j + 1).ToString(); 22 node.Nodes.Add(childNode); 23 } 24 } 25 tvTest.EndUpdate();
26

新建一個類TreeViewCheck,用於TreeView父子級節點的選擇事件,實現父級節點選中子節點跟著選擇的效果。

 1  public static class TreeViewCheck
 2     {
 3         /// <summary>
 4         /// 系列節點 Checked 屬性控制
 5         /// </summary>
 6         /// <param name="e"></param>
 7         public static void CheckControl(TreeViewEventArgs e)
 8         {
 9             if (e.Action != TreeViewAction.Unknown)
10             {
11                 if (e.Node != null && !Convert.IsDBNull(e.Node))
12                 {
13                     CheckParentNode(e.Node);
14                     if (e.Node.Nodes.Count > 0)
15                     {
16                         CheckAllChildNodes(e.Node,e.Node.Checked);
17                     }
18                 }
19             }
20         }
21 
22         #region 私有方法
23 
24         //改變所有子節點的狀態
25         private static void CheckAllChildNodes(TreeNode pn,bool IsChecked)
26         {
27             foreach (TreeNode tn in pn.Nodes)
28             {
29                 tn.Checked = IsChecked;
30 
31                 if (tn.Nodes.Count > 0)
32                 {
33                     CheckAllChildNodes(tn,IsChecked);
34                 }
35             }
36         }
37 
38         //改變父節點的選中狀態,此處為所有子節點不選中時才取消父節點選中,可以根據需要修改
39         private static void CheckParentNode(TreeNode curNode)
40         {
41             bool bChecked = false;
42 
43             if (curNode.Parent != null)
44             {
45                 foreach (TreeNode node in curNode.Parent.Nodes)
46                 {
47                     if (node.Checked)
48                     {
49                         bChecked = true;
50                         break;
51                     }
52                 }
53 
54                 if (bChecked)
55                 {
56                     curNode.Parent.Checked = true;
57                     CheckParentNode(curNode.Parent);
58                 }
59                 else
60                 {
61                     curNode.Parent.Checked = false;
62                     CheckParentNode(curNode.Parent);
63                 }
64             }
65         }
66 
67         #endregion
68     }

好了,那麼在TreeView的選擇事件中呼叫。

1 private void tvTest_AfterCheck(object sender,TreeViewEventArgs e)
2 {
3    TreeViewCheck.CheckControl(e);
4 }

實現的效果如下:

技術分享圖片

最後的關鍵,如何獲取我選擇到的節點值呢?

這裡使用whlie迴圈取每個父級節點的子節點。

程式碼如下:

 1 List<string> lstSelect=new List<string>();  //儲存值的list
 2   
 3  //選擇第一個節點
 4             TreeNode selectNodes = tvTest.Nodes[0];
 5             while (selectNodes != null)
 6             {
 7                 TreeNode childNode = null;          //根節點的被選中的子節點
 8 
 9                 childNode = selectNodes.FirstNode;
10                 while (childNode != null)           //找該節點的所有被選擇的子節點
11                 {
12                     if (childNode.Checked)
13                     {
14                         //處理資料。儲存節點的值
15 
16                         lstSelect.Add(childNode.Tag.ToString());
17                     }
18                     childNode = childNode.NextNode;
19                 }
20                 selectNodes = selectNodes.NextNode;          //下一個被選中的節點
21             }

好了,思路就是這樣,可以拿去參考。