前台代码,TreeView
1 <div class="dropdown"> 2 <asp:TreeView ID="Tree_Knowledge" runat="server" Height="263px" ShowCheckBoxes="All" ShowLines="True" Width="336px" ExpandDepth="0" OnTreeNodeCheckChanged="TreeNodeCheckChanged" ></asp:TreeView> 3 </div> 4 5 <script type="text/javascript"> 6 // 点击复选框时触发事件 7 function postBackByObject() { 8 var o = event.srcElement; 9 if (o.tagName == "INPUT" && o.type == "checkbox") { 10 __doPostBack("", ""); 11 } 12 13 } 14 15 </script>
后台cs代码:
protected void BinTree() { beanitem = bllItem.Get_Single(LessonID); dt1 = bllknowledge.selectbyCT(dt1, beanitem.techtask.beancoursetype.CourseTypeid); Tree_Knowledge.Nodes.Clear(); Tree_Knowledge.Attributes.Add("onclick", "postBackByObject()"); AddTree(0,null); } protected void AddTree(int ParentID, TreeNode PNode) { if (dt1.Rows.Count > 0) { DataView dv = new DataView(dt1); //过滤ParentID,得到当前的所有子节点 ParentID为父节点ID dv.RowFilter = "[parentid] = " + ParentID; //循环递归 foreach (DataRowView Row in dv) { //声明节点 TreeNode Node = new TreeNode(); Node.SelectAction = TreeNodeSelectAction.None; //开始递归 if (PNode == null) { //添加根节点 Node.Text = Row["name"].ToString(); Tree_Knowledge.Nodes.Add(Node); AddTree(Int32.Parse(Row["id"].ToString()), Node); //再次递归 } else { //添加当前节点的子节点 Node.Text = Row["name"].ToString(); PNode.ChildNodes.Add(Node); AddTree(Int32.Parse(Row["id"].ToString()), Node); //再次递归 } } } } protected void TreeNodeCheckChanged(object sender, TreeNodeEventArgs e) { SetChildCheck(e.Node); } protected void SetChildCheck(TreeNode PNode) { foreach (TreeNode node in PNode.ChildNodes) { node.Checked = PNode.Checked; if (node.ChildNodes.Count > 0) { SetChildCheck(node); } } }
前台复选框为什么触发不了TreeNodeCheckChanged事件,这是.Net TreeView自带的属性还是动不了?谢谢!
TreeNodeCheckChanged事件是在每一项前面的checkbox状态改变时才会触发的。
恩,对的,但问题是 我单击checkbox不触发,调试过单击之后根本不跳进TreeNodeCheckChanged函数。
@码码码农: 选中checkbox之后,再点击项看看,它不是通过checkbox来触发的,是判断checkbox的状态触发的。
@火悬崖: 我试试,我把节点的单击触发关了,打算只用checkbox的,谢啦