TreeView的子节点和父节点级联选中

TreeView的子节点和父节点级联选中

参考:(TreeView的子节点和父节点级联选中)http://blog.sina.com.cn/s/blog_56616d970100c483.html

(TreeView点击文字选中和点击父节点选中子节点 )http://hi.baidu.com/lhlsxdx/blog/item/44988f8f95f006e4f01f3691.html

(C#中遍历TreeView并查找和选定节点 )http://apps.hi.baidu.com/share/detail/616013

aspx:

[html]  view plain  copy
  1. <html xmlns="http://www.w3.org/1999/xhtml">  
  2. <head runat="server">  
  3.     <title>测试树的级联选中和取消</title>  
  4.     <script type="text/javascript">  
  5.     function postBackByObject()  
  6.     {  
  7.         var obj = window.event.srcElement;  
  8.         if(obj.tagName == "INPUT" && obj.type == "checkbox")  
  9.         {  
  10.             __doPostBack("","");  
  11.         }  
  12.     }  
  13.   
  14.     </script>  
  15. </head>  
  16. <body>  
  17.     <form id="form1" runat="server">  
  18.     <div>  
  19.         <asp:TreeView ID="TreeView1" runat="server" OnTreeNodeCheckChanged="TreeView1_TreeNodeCheckChanged"  
  20.             ShowCheckBoxes="All" ShowLines="True" onselectednodechanged="TreeView1_SelectedNodeChanged"></asp:TreeView>  
  21.     </div>  
  22.     </form>  
  23. </body>  
  24. </html>  

后台代码:

[csharp]  view plain  copy
  1. protected void Page_Load(object sender, EventArgs e)  
  2.         {  
  3.             if(!IsPostBack)  
  4.             {  
  5.                 this.TreeView1.Attributes.Add("onclick""postBackByObject()");  
  6.                 TreeView1.Attributes.Add("onselectednodechanged""TreeView1_SelectedNodeChanged");  
  7.                 Bind();  
  8.             }  
  9. }  
  10.           
  11.           
  12.     void Bind()  
  13.         {  
  14. List<ContactGroupDomain> nodes = (List<ContactGroupDomain>)Helper.ContactGroup().GetAllGroup(uid);  
  15.             if(null == nodes)  
  16.             {  
  17.                 return;  
  18.             }  
  19.             for(int i = 0; i < nodes.Count; i++)//按节点数量循环  
  20.             {  
  21.                 TreeNode node = new TreeNode();  
  22.                 node.Value = nodes[i].CGID;  
  23.                 node.Text = nodes[i].CGName;  
  24.                 BindChildNode(node);  
  25.                 TreeView1.Nodes.Add(node);  
  26.             }  
  27.         }  
  28.   
  29.         void BindChildNode(TreeNode node)  
  30.         {  
  31.             List<ContactPersonDomain> personList = (List<ContactPersonDomain>)Helper.ContactPerson().GetContactByGID(uid, node.Value);  
  32.             for(int i = 0; i < personList.Count; i++)  
  33.             {  
  34.                 TreeNode childNode = new TreeNode();  
  35.                 childNode.Value = personList[i].CPID;  
  36.                 childNode.Text = personList[i].CPName;  
  37.                 node.ChildNodes.Add(childNode);  
  38.             }  
  39.         }  
  40.   
  41.         <p> protected void TreeView1_TreeNodeCheckChanged(object sender, TreeNodeEventArgs e)  
  42.         {  
  43.             SetChildChecked(e.Node);  
  44.             SetParentChecked(e.Node);  
  45.         }</p><p>        /// <summary>  
  46.         /// 选中父节点,其所有子节点也选中  
  47.         /// </summary>  
  48.         /// <param name="parentNode"></param>  
  49.         private void SetChildChecked(TreeNode parentNode)  
  50.         {  
  51.             if(parentNode.Checked == true)  
  52.             {  
  53.                 foreach(TreeNode tn in parentNode.ChildNodes)  
  54.                 {  
  55.                     tn.Checked = parentNode.Checked;  
  56.                     if(tn.ChildNodes.Count > 0)  
  57.                     {  
  58.                         SetChildChecked(tn);  
  59.                     }  
  60.                 }  
  61.             }  
  62.             else  
  63.             {  
  64.                 foreach(TreeNode tn in parentNode.ChildNodes)  
  65.                 {  
  66.                     tn.Checked = parentNode.Checked;  
  67.                     if(tn.ChildNodes.Count > 0)  
  68.                     {  
  69.                         SetChildChecked(tn);  
  70.                     }  
  71.                 }  
  72.             }  
  73.         }</p><p>        /// <summary>  
  74.         /// 选中子节点,其父节点也选中  
  75.         /// </summary>  
  76.         /// <param name="childNode"></param>  
  77.         private void SetParentChecked(TreeNode childNode)  
  78.         {  
  79.             if(childNode.Checked == true)  
  80.             {  
  81.                 if(childNode.Parent != null)  
  82.                 {  
  83.                     childNode.Parent.Checked = childNode.Checked;  
  84.                     SetParentChecked(childNode.Parent);  
  85.                 }  
  86.             }  
  87.             else  
  88.             {  
  89.                 if(childNode.Parent != null)  
  90.                 {  
  91.                     if(!CheckChildAllCheck(childNode.Parent))  
  92.                     {  
  93.                         childNode.Parent.Checked = childNode.Checked;  
  94.                         SetParentChecked(childNode.Parent);  
  95.                     }  
  96.                 }  
  97.             }  
  98.         }</p><p>        /// <summary>  
  99.         /// 判断当前节点的兄弟节点及其子节点有没有选中的,如果有,直接返回true  
  100.         /// 如果没有,继续递归。  
  101.         /// </summary>  
  102.         /// <param name="node"></param>  
  103.         /// <returns></returns>  
  104.         private bool CheckChildAllCheck(TreeNode node)  
  105.         {  
  106.             bool isCheck = false;  
  107.             foreach(TreeNode childNode in node.ChildNodes)  
  108.             {  
  109.                 if(childNode.Checked)  
  110.                 {  
  111.                     return true;  
  112.                 }  
  113.                 else  
  114.                 {  
  115.                     isCheck = CheckChildAllCheck(childNode);  
  116.                 }  
  117.             }  
  118.             return isCheck;  
  119.         }</p>    protected void TreeView1_SelectedNodeChanged(object sender, EventArgs e)  
  120.         {  
  121.             TreeNode treeNode = TreeView1.SelectedNode;  
  122.         }  

程序中的对象集合大家根据自己的实际需要更改。

效果图:


选中“三级节点1”,它的的所有父节点都会选中。

 

 

C#中遍历TreeView并查找和选定节点

[csharp]  view plain  copy
  1. 首先先看一段MSDN上的示例程序:打印一个树中所有节点名称  
  2. private void PrintRecursive(TreeNode treeNode)  
  3. {  
  4.     // Print the node.  
  5.      System.Diagnostics.Debug.WriteLine(treeNode.Text);  
  6.      MessageBox.Show(treeNode.Text);  
  7.     // Print each node recursively.  
  8.    foreach (TreeNode tn in treeNode.Nodes)  
  9.     {  
  10.          PrintRecursive(tn);  
  11.      }  
  12. }  
  13.   
  14. // Call the procedure using the TreeView.  
  15. private void CallRecursive(TreeView treeView)  
  16. {  
  17.     // Print each node recursively.  
  18.      TreeNodeCollection nodes = treeView.Nodes;  
  19.     foreach (TreeNode n in nodes)  
  20.     {  
  21.          PrintRecursive(n);  
  22.      }  
  23. }  

然后要说明的是一下TreeView类和TreeNode类之间的关系:TreeView类中有个只读属性是Nodes,它是属于TreeNodeCollection类型的,而对于一个TreeView它的Nodes属性就是返回treeView根结点的集合。

然后就是我的递归遍历查找一个树节点的方法(由于程序需要我是根据树节点的ImageIndex属性查找的):

[csharp]  view plain  copy
  1. private TreeNode FindTreeNode(int imageIndex, TreeNode tnParent)  
  2. {  
  3.     if (tnParent == null)  
  4.         return null;  
  5.     if (tnParent.ImageIndex == imageIndex)  
  6.         return tnParent;  
  7.      TreeNode tnRet = null;  
  8.     foreach (TreeNode tn in tnParent.Nodes)  
  9.      {  
  10.          tnRet = FindTreeNode(imageIndex, tn);  
  11.         if (tnRet != null)  
  12.             break;  
  13.      }  
  14.     return tnRet;  
  15. }  
  16.   
  17. private TreeNode CallFindNode(int imageIndex, TreeView treeView)  
  18. {  
  19.      TreeNodeCollection nodes = treeView.Nodes;  
  20.     foreach (TreeNode n in nodes)  
  21.      {  
  22.          TreeNode temp = FindTreeNode(imageIndex, n);  
  23.         if (temp != null)  
  24.             return temp;  
  25.      }  
  26.     return null;  
  27. }  
  28.   
  29. /// <summary>  
  30. /// 这个是一个点击事件,其中改变了选中节点,  
  31. /// 改变选中节点的同时就触发了selectedNodeChanged事件  
  32. /// </summary>  
  33. /// <param name="sender"></param>  
  34. /// <param name="e"></param>  
  35. void myControlTransactions_AddCustomer(object sender, EventArgs e)  
  36. {  
  37.      TreeNode temp = CallFindNode(3, treeView1);  
  38.     if (temp != null)  
  39.          treeView1.SelectedNode = temp;  
  40. }  
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值