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             }

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

    


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM