Asp.net多个网格视图,headertemplate中的复选框选择全部/取消选择所有功能

时间:2011-12-01 06:02:09

标签: javascript asp.net c#-4.0

我在aspx页面中使用了两个gridview控件。我的控件中都有一列复选框。我正在通过在两个网格视图的标题模板中提供一个复选框并使用java脚本函数来促进用户选择/取消选择我的两个网格视图中的所有复选框。下面是代码

<script type="text/javascript">
    function UncheckParent(obj) {
        var isUnchecked = obj.checked;
        if (isUnchecked == false) {
            var frm = document.forms[0];
            for (i = 0; i < frm.length; i++) {
                if (frm.elements[i].id.indexOf('chkSelectAllCheckboxes') != -1) {
                    frm.elements[i].checked = false;
                }
            }
        }

    }

    function CheckAll(obj) {
        var row = obj.parentNode.parentNode.parentNode.parentNode.parentNode.parentNode.parentNode;
        var inputs = row.getElementsByTagName("input");
        for (var i = 0; i < inputs.length; i++) {
            if (inputs[i].type == "checkbox") {
                inputs[i].checked = obj.checked;
            }
        }
    }
</script>

但问题是,一旦我选择或取消选择其中一个复选框,就会检查两个网格视图中的所有复选框。我还可以举一个简短的例子说明正在发生的事情。两个gridviews gdvwStudents和gdvwTeachers。两者都有复选框列和标题模板中的复选框。当我点击gdvwStudents的标题复选框时使用上面的代码,gdvStudents和gdvTeachers中的所有复选框都被选中。请

3 个答案:

答案 0 :(得分:0)

你做错了。您应该在单击标题的特定网格内获取复选框;相反,您将获得ALL在表单上创建的复选框!这是非常低效的,并解释了为什么一切都被选中/取消选中,无论你点击哪个标题。

如果你可以使用jQuery,你应该能够将这些函数重写为:

function checkAll(gridID,checkbox) {
    $("#"+gridID+" input:checkbox").attr("checked",checkbox.checked);
}

请参阅this jsfiddle以获取快速示例。

答案 1 :(得分:0)

按照以下

添加javascript功能
 <script type="text/javascript">
 function SelectAll(id, grd) {
     //get reference of GridView control
     var grid = null;
     if (grd = "1") {
         grid = document.getElementById("<%= GridView1.ClientID %>");
     }
     else {
         grid = document.getElementById("<%= GridView2.ClientID %>");
     }


     //variable to contain the cell of the grid
     var cell;

     if (grid.rows.length > 0) {
         //loop starts from 1. rows[0] points to the header.
         for (i = 1; i < grid.rows.length; i++) {
             //get the reference of first column
             cell = grid.rows[i].cells[0];

             //loop according to the number of childNodes in the cell
             for (j = 0; j < cell.childNodes.length; j++) {
                 //if childNode type is CheckBox                 
                 if (cell.childNodes[j].type == "checkbox") {
                     //assign the status of the Select All checkbox to the cell checkbox within the grid
                     cell.childNodes[j].checked = document.getElementById(id).checked;
                 }
             }
         }
     }
 }
</script>   

并处理gridviews的Rowbound事件绑定javascript函数的调用,如下所示

   protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
    {
        if (e.Row.RowType == DataControlRowType.Header)
        { 
            //Find the checkbox control in header and add an attribute
            ((CheckBox)e.Row.FindControl("cbSelectAll")).Attributes.Add("onclick", "javascript:SelectAll('" + 
                    ((CheckBox)e.Row.FindControl("cbSelectAll")).ClientID + "'" + ", '1')" );
        }
    }

    protected void GridView2_RowDataBound(object sender, GridViewRowEventArgs e)
    {
        if (e.Row.RowType == DataControlRowType.Header)
        { 
            //Find the checkbox control in header and add an attribute
            ((CheckBox)e.Row.FindControl("cbSelectAll")).Attributes.Add("onclick", "javascript:SelectAll('" + 
                    ((CheckBox)e.Row.FindControl("cbSelectAll")).ClientID + "'" + ", '2')" );
        }
    }

答案 2 :(得分:0)

这就是我管理它的方式:

        function UnCheckAllContainer(obj) {
        var isUnchecked = obj.checked;
        if (isUnchecked == false) {
            var frm = document.forms[0];
            for (i = 0; i < frm.length; i++) {
                if (frm.elements[i].id.indexOf('chkSelectAllCheckboxesContainers') != -1
                ) {
                    frm.elements[i].checked = false;
                }
            }
        }
    }

    function CheckAllContainer(chk) {
        $('#<%=gdvwContainers.ClientID %>').find("input:checkbox").each(function () {
            if (this != chk) {
                this.checked = chk.checked;
            }
        });

    }