1

我有一个 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 行并将它们全部加起来一次?

4

1 回答 1

2

如果您考虑在一次回发中在服务器上完成所有操作,您可以尝试以下操作:

<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 
        }
    }
于 2012-09-30T20:24:19.340 回答