如何让GridView checkAll复选框不激活各个复选框?

时间:2012-09-30 19:32:47

标签: c# asp.net gridview

我有一个GridView,每行包含一个复选框,该列的标题是一个带checkAll功能的复选框:

<Columns>
     <asp:TemplateField>
            <HeaderTemplate>
                   <input id="chkAll" onclick="javascript:SelectAllCheckboxes(this);"                                       runat="server" type="checkbox" />
            </HeaderTemplate>
            <ItemTemplate>
                   <asp:CheckBox ID="chkSelect" runat="server" ToolTip="Select this order" AutoPostBack="true" OnCheckedChanged="chkSelect_OnCheckedChanged"/>
            </ItemTemplate>
     </asp:TemplateField>
     ...More BoundFields
</Columns>

SelectAllCheckboxes()

背后的javascript
function SelectAllCheckboxes(spanChk) {

        // Added as ASPX uses SPAN for checkbox

        var oItem = spanChk.children;
        var theBox = (spanChk.type == "checkbox") ?
    spanChk : spanChk.children.item[0];
        xState = theBox.checked;
        elm = theBox.form.elements;

        for (i = 0; i < elm.length; i++)
            if (elm[i].type == "checkbox" &&
          elm[i].id != theBox.id) {
                //elm[i].click();

                if (elm[i].checked != xState)
                    elm[i].click();
                //elm[i].checked=xState;

            }
    }

我的GridView基本上包含来自我网站的销售(订单),所以美元金额。 OnCheckedChanged事件添加(如果选中)或从页面上显示的totalAmount中减去当前行的价格(如果未选中)。 这一切都很有效,除了当我单击checkAll复选框时,所有行复选框的所有OnCheckedChanged事件都会触发,并且需要很长时间来处理它。因为我在OnCheckedChanged方法中所做的就是总和金额,有没有办法让我不能为各个复选框调用事件,只需调用一个单独的方法来获取所有GridView行并将它们全部加在一起一次?

1 个答案:

答案 0 :(得分:1)

如果你考虑在一个回发中在服务器上完成所有操作,你可以试试这个:

<Columns>
    <asp:TemplateField>
         <HeaderTemplate>
              <asp:CheckBox ID="chkAll" runat="server" ToolTip="Select this order" AutoPostBack="true" OnCheckedChanged="chkAll_OnCheckedChanged"/>
         </HeaderTemplate>
         <ItemTemplate>
              <asp:CheckBox ID="chkSelect" runat="server" ToolTip="Select this order" AutoPostBack="true" OnCheckedChanged="chkSelect_OnCheckedChanged"/>
         </ItemTemplate>
    </asp:TemplateField>
</Columns>

关于背后的代码:

    protected void chkSelect_OnCheckedChanged(object sender, EventArgs e)
    { 
        //Process checked item 
    }

    protected void chkAll_OnCheckedChanged(object sender, EventArgs e)
    {
        foreach (GridViewRow item in grdTest.Rows)
        {
            CheckBox ckb = (CheckBox)item.FindControl("chkSelect");

            //This will not call the individual event
            ckb.Checked = ((CheckBox)sender).Checked;
            //Process checked item 
        }
    }
相关问题