//页面
          <ItemTemplate>
                                        <asp:CheckBox ID="cb" runat="server" OnCheckedChanged="cb_CheckedChanged" AutoPostBack="true"  /><%#Eval("MenuName") %>
                                        <asp:CheckBoxList ID="cbl" AutoPostBack="true" runat="server" RepeatDirection="Horizontal"
                                            RepeatColumns="6">
                                        </asp:CheckBoxList>                                     
                      </ItemTemplate>//后台
  protected void cb_CheckedChanged(object sender, EventArgs e)
        {
            for (int i = 0; i < this.dlt.Items.Count; i++)
            {
                CheckBox cb = (CheckBox)dlt.Items[i].FindControl("cb");
                CheckBoxList cbl = (CheckBoxList)dlt.Items[i].FindControl("cbl");                for (int j = 0; j < cbl.Items.Count; j++)
                {
                    if (cb.Checked == true)
                    {
                        cbl.Items[j].Selected = true;
                    }
                    else if(cb.Checked==false)
                    {
                        cbl.Items[j].Selected = false;
                    }
                    
                    
                }            }
        }我想要实现的功能是,点击父节点,则子节点全部选中,这个可以实现。接下来是把所有子节点的选中取消掉,则父节点的选中也取消,我的代码该如何改进? 谢谢!

解决方案 »

  1.   

    用后台代码实现?为什么不用JavaScript呢
      

  2.   

     protected void cb_CheckedChanged(object sender, EventArgs e)
            {
                for (int i = 0; i < this.dlt.Items.Count; i++)
                {
                    CheckBox cb = (CheckBox)dlt.Items[i].FindControl("cb");
                    CheckBoxList cbl = (CheckBoxList)dlt.Items[i].FindControl("cbl");                for (int j = 0; j < cbl.Items.Count; j++)
                    {
                        if (cb.Checked == true)
                        {
                            cbl.Items[j].Selected = true;
                        }
                        else if(cb.Checked==false)
                        {
                            cbl.Items[j].Selected = false;
                        }
         --------------    if ( cbl.Items[j].Selected == false)---------
                        {
                            cb.Checked=false;
                        }
                        else if(cbl.Items[j].Selected == true)
                        {
                            cb.Checked=true;
                        }
         ---------------------------------------------------------------               
                        
                    }            }
            }再加个IF判断。
      

  3.   

    给你找了一个比较通用的:
    function public_GetParentByTagName(element, tagName) 

    var parent = element.parentNode; 
    var upperTagName = tagName.toUpperCase(); 
    //如果这个元素还不是想要的tag就继续上溯 
    while (parent && (parent.tagName.toUpperCase() != upperTagName)) 

    parent = parent.parentNode ? parent.parentNode : parent.parentElement; 

    return parent; 
    } //设置节点的父节点Cheched——该节点可访问,则他的父节点也必能访问 
    function setParentChecked(objNode) 

    var objParentDiv = public_GetParentByTagName(objNode,"div"); 
    if(objParentDiv==null || objParentDiv == "undefined") 

    return; 

    var objID = objParentDiv.getAttribute("ID"); 
    objID = objID.substring(0,objID.indexOf("Nodes")); 
    objID = objID+"CheckBox"; 
    var objParentCheckBox = document.getElementById(objID); 
    if(objParentCheckBox==null || objParentCheckBox == "undefined") 

    return; 

    if(objParentCheckBox.tagName!="INPUT" && objParentCheckBox.type == "checkbox") 
    return; 
    objParentCheckBox.checked = true; 
    setParentChecked(objParentCheckBox); 
    } //设置节点的子节点uncheched——该节点不可访问,则他的子节点也不能访问 
    function setChildUnChecked(divID) 

    var objchild = divID.children; 
    var count = objchild.length; 
    for(var i=0;i<objchild.length;i++) 

    var tempObj = objchild[i]; 
    if(tempObj.tagName=="INPUT" && tempObj.type == "checkbox") 

    tempObj.checked = false; 

    setChildUnChecked(tempObj); 

    } //设置节点的子节点cheched——该节点可以访问,则他的子节点也都能访问 
    function setChildChecked(divID) 

    var objchild = divID.children; 
    var count = objchild.length; 
    for(var i=0;i<objchild.length;i++) 

    var tempObj = objchild[i]; 
    if(tempObj.tagName=="INPUT" && tempObj.type == "checkbox") 

    tempObj.checked = true; 

    setChildChecked(tempObj); 

    } //触发事件 
    function CheckEvent() 
    { var objNode = event.srcElement; if(objNode.tagName!="INPUT" || objNode.type!="checkbox") 
    return; if(objNode.checked==true) 

    setParentChecked(objNode); 
    var objID = objNode.getAttribute("ID"); 
    var objID = objID.substring(0,objID.indexOf("CheckBox")); 
    var objParentDiv = document.getElementById(objID+"Nodes"); 
    if(objParentDiv==null || objParentDiv == "undefined") 

    return; 

    setChildChecked(objParentDiv); 

    else 

    var objID = objNode.getAttribute("ID"); 
    var objID = objID.substring(0,objID.indexOf("CheckBox")); 
    var objParentDiv = document.getElementById(objID+"Nodes"); 
    if(objParentDiv==null || objParentDiv == "undefined") 

    return; 

    setChildUnChecked(objParentDiv); 


      

  4.   

     protected void cbl_SelectedIndexChanged(object sender, EventArgs e)
        {
            bool trueOrfalse=false;
                CheckBox cb = (CheckBox)dlt.Items[i].FindControl("cb");
                CheckBoxList cbl = (CheckBoxList)dlt.Items[i].FindControl("cbl");            for (int j = 0; j < cbl.Items.Count; j++)
                {
                   
                     if(cbl.Items[j].Selected == true)
                    {
                        trueOrfalse=true;
                    }
                }
            if (trueOrfalse)
    {
            cb.Checked=true;
    }
            }    }
    这次应该可以了,你再写个这事件。。
      

  5.   

    这里是空的CheckBox cb = (CheckBox)dlt.Items[i].FindControl("cb");
      

  6.   

    //CheckBox2是 在GridView1之外,
    //CheckBox1是在GridView1的模板列中的
       protected void CheckBox2_CheckedChanged(object sender, EventArgs e)
        {//复选
            if (CheckBox2.Checked == true)
            {
                CheckBox2.Text = "全选";
                for (int i = 0; i < GridView1.Rows.Count; i++)
                {
                    CheckBox cbox = (CheckBox)GridView1.Rows[i].FindControl("CheckBox1");                cbox.Checked = true;
                }
            }
            else
            {
                CheckBox2.Text = "全不选";
                for (int i = 0; i < GridView1.Rows.Count; i++)
                {
                    CheckBox cbox = (CheckBox)GridView1.Rows[i].FindControl("CheckBox1");                cbox.Checked = false;
                }
            }
        }
      

  7.   


    哦,少了一个你那个循环
     for (int i = 0; i < this.dlt.Items.Count; i++)
      {

    }
      

  8.   

    回gdlpc兄,我这个是DataList,不是GirdView<asp:UpdatePanel ID="UpdatePanel1" runat="server">
                                <ContentTemplate>
                                    <asp:DataList ID="dlt" runat="server" DataKeyField="autoid" OnItemDataBound="dlt_ItemDataBound" 
                                        RepeatDirection="Vertical">
                                        <ItemTemplate>
                                            <asp:CheckBox ID="cb" runat="server" OnCheckedChanged="cb_CheckedChanged" AutoPostBack="true"  /><%#Eval("MenuName") %>
                                            <asp:CheckBoxList ID="cbl" AutoPostBack="true" runat="server" RepeatDirection="Horizontal"
                                                RepeatColumns="6">
                                            </asp:CheckBoxList>
                                            
                                        </ItemTemplate>
                                    </asp:DataList>
     protected void cb_CheckedChanged(object sender, EventArgs e)
            {
                for (int i = 0; i < this.dlt.Items.Count; i++)
                {
                    CheckBox cb = (CheckBox)dlt.Items[i].FindControl("cb");
                    CheckBoxList cbl = (CheckBoxList)dlt.Items[i].FindControl("cbl");
                    
                    for (int j = 0; j < cbl.Items.Count; j++)
                    {
                        if (cb.Checked == true)
                        {
                            cbl.Items[j].Selected = true;
                        }
                        else if (cb.Checked == false)
                        {
                            cbl.Items[j].Selected = false;
                        }
                    }
                }
                
            }我的代码该如何改才能实现我说的效果。
      

  9.   

    GridView控件里记得可以实现这个功能