日常開發中,經常需要實現多選的樹結構,並且可能存在多級節點的情況。
以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 }
好了,思路就是這樣,可以拿去參考。