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 xmlns="http://www.w3.org/1999/xhtml">
- <head runat="server">
- <title>测试树的级联选中和取消</title>
- <script type="text/javascript">
- function postBackByObject()
- {
- var obj = window.event.srcElement;
- if(obj.tagName == "INPUT" && obj.type == "checkbox")
- {
- __doPostBack("","");
- }
- }
- </script>
- </head>
- <body>
- <form id="form1" runat="server">
- <div>
- <asp:TreeView ID="TreeView1" runat="server" OnTreeNodeCheckChanged="TreeView1_TreeNodeCheckChanged"
- ShowCheckBoxes="All" ShowLines="True" onselectednodechanged="TreeView1_SelectedNodeChanged"></asp:TreeView>
- </div>
- </form>
- </body>
- </html>
后台代码:
- protected void Page_Load(object sender, EventArgs e)
- {
- if(!IsPostBack)
- {
- this.TreeView1.Attributes.Add("onclick", "postBackByObject()");
- TreeView1.Attributes.Add("onselectednodechanged", "TreeView1_SelectedNodeChanged");
- Bind();
- }
- }
- void Bind()
- {
- List<ContactGroupDomain> nodes = (List<ContactGroupDomain>)Helper.ContactGroup().GetAllGroup(uid);
- if(null == nodes)
- {
- return;
- }
- for(int i = 0; i < nodes.Count; i++)//按节点数量循环
- {
- TreeNode node = new TreeNode();
- node.Value = nodes[i].CGID;
- node.Text = nodes[i].CGName;
- BindChildNode(node);
- TreeView1.Nodes.Add(node);
- }
- }
- void BindChildNode(TreeNode node)
- {
- List<ContactPersonDomain> personList = (List<ContactPersonDomain>)Helper.ContactPerson().GetContactByGID(uid, node.Value);
- for(int i = 0; i < personList.Count; i++)
- {
- TreeNode childNode = new TreeNode();
- childNode.Value = personList[i].CPID;
- childNode.Text = personList[i].CPName;
- node.ChildNodes.Add(childNode);
- }
- }
- <p> protected void TreeView1_TreeNodeCheckChanged(object sender, TreeNodeEventArgs e)
- {
- SetChildChecked(e.Node);
- SetParentChecked(e.Node);
- }</p><p> /// <summary>
- /// 选中父节点,其所有子节点也选中
- /// </summary>
- /// <param name="parentNode"></param>
- private void SetChildChecked(TreeNode parentNode)
- {
- if(parentNode.Checked == true)
- {
- foreach(TreeNode tn in parentNode.ChildNodes)
- {
- tn.Checked = parentNode.Checked;
- if(tn.ChildNodes.Count > 0)
- {
- SetChildChecked(tn);
- }
- }
- }
- else
- {
- foreach(TreeNode tn in parentNode.ChildNodes)
- {
- tn.Checked = parentNode.Checked;
- if(tn.ChildNodes.Count > 0)
- {
- SetChildChecked(tn);
- }
- }
- }
- }</p><p> /// <summary>
- /// 选中子节点,其父节点也选中
- /// </summary>
- /// <param name="childNode"></param>
- private void SetParentChecked(TreeNode childNode)
- {
- if(childNode.Checked == true)
- {
- if(childNode.Parent != null)
- {
- childNode.Parent.Checked = childNode.Checked;
- SetParentChecked(childNode.Parent);
- }
- }
- else
- {
- if(childNode.Parent != null)
- {
- if(!CheckChildAllCheck(childNode.Parent))
- {
- childNode.Parent.Checked = childNode.Checked;
- SetParentChecked(childNode.Parent);
- }
- }
- }
- }</p><p> /// <summary>
- /// 判断当前节点的兄弟节点及其子节点有没有选中的,如果有,直接返回true
- /// 如果没有,继续递归。
- /// </summary>
- /// <param name="node"></param>
- /// <returns></returns>
- private bool CheckChildAllCheck(TreeNode node)
- {
- bool isCheck = false;
- foreach(TreeNode childNode in node.ChildNodes)
- {
- if(childNode.Checked)
- {
- return true;
- }
- else
- {
- isCheck = CheckChildAllCheck(childNode);
- }
- }
- return isCheck;
- }</p> protected void TreeView1_SelectedNodeChanged(object sender, EventArgs e)
- {
- TreeNode treeNode = TreeView1.SelectedNode;
- }
程序中的对象集合大家根据自己的实际需要更改。
效果图:
选中“三级节点1”,它的的所有父节点都会选中。
C#中遍历TreeView并查找和选定节点
- 首先先看一段MSDN上的示例程序:打印一个树中所有节点名称
- private void PrintRecursive(TreeNode treeNode)
- {
- // Print the node.
- System.Diagnostics.Debug.WriteLine(treeNode.Text);
- MessageBox.Show(treeNode.Text);
- // Print each node recursively.
- foreach (TreeNode tn in treeNode.Nodes)
- {
- PrintRecursive(tn);
- }
- }
- // Call the procedure using the TreeView.
- private void CallRecursive(TreeView treeView)
- {
- // Print each node recursively.
- TreeNodeCollection nodes = treeView.Nodes;
- foreach (TreeNode n in nodes)
- {
- PrintRecursive(n);
- }
- }
然后要说明的是一下TreeView类和TreeNode类之间的关系:TreeView类中有个只读属性是Nodes,它是属于TreeNodeCollection类型的,而对于一个TreeView它的Nodes属性就是返回treeView根结点的集合。
然后就是我的递归遍历查找一个树节点的方法(由于程序需要我是根据树节点的ImageIndex属性查找的):
- private TreeNode FindTreeNode(int imageIndex, TreeNode tnParent)
- {
- if (tnParent == null)
- return null;
- if (tnParent.ImageIndex == imageIndex)
- return tnParent;
- TreeNode tnRet = null;
- foreach (TreeNode tn in tnParent.Nodes)
- {
- tnRet = FindTreeNode(imageIndex, tn);
- if (tnRet != null)
- break;
- }
- return tnRet;
- }
- private TreeNode CallFindNode(int imageIndex, TreeView treeView)
- {
- TreeNodeCollection nodes = treeView.Nodes;
- foreach (TreeNode n in nodes)
- {
- TreeNode temp = FindTreeNode(imageIndex, n);
- if (temp != null)
- return temp;
- }
- return null;
- }
- /// <summary>
- /// 这个是一个点击事件,其中改变了选中节点,
- /// 改变选中节点的同时就触发了selectedNodeChanged事件
- /// </summary>
- /// <param name="sender"></param>
- /// <param name="e"></param>
- void myControlTransactions_AddCustomer(object sender, EventArgs e)
- {
- TreeNode temp = CallFindNode(3, treeView1);
- if (temp != null)
- treeView1.SelectedNode = temp;
- }