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行を取得してすべてを合計する別のメソッドを1回呼び出すだけの方法はありますか?一度?

4

1 に答える 1

2

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