web-dev-qa-db-ja.com

UpdatePanel内のGridView内のLinkBut​​tonによってトリガーされる完全なポストバック

UpdatePanel内にGridViewがあります。テンプレートフィールドには、アイテムをマークするために使用するボタンがあります。機能的には、これは正常に機能しますが、ボタンは常に部分的なポストバックではなく、全ページのポストバックをトリガーします。部分的なポストバックをトリガーするボタンを取得するにはどうすればよいですか?

<asp:ScriptManager ID="ContentScriptManager" runat="server" />
<asp:UpdatePanel ID="ContentUpdatePanel" runat="server" ChildrenAsTriggers="true">
    <ContentTemplate>
        <asp:GridView ID="OrderGrid" runat="server" AllowPaging="false" AllowSorting="false"
            AutoGenerateColumns="false">
            <Columns>
                <asp:TemplateField HeaderText="">
                    <ItemTemplate>
                        <asp:LinkButton ID="MarkAsCompleteButton" runat="server" Text="MarkAsComplete"
                            CommandName="MarkAsComplete" CommandArgument='<%# Eval("Id") %>' />
                    </ItemTemplate>
                </asp:TemplateField>
                <asp:BoundField DataField="Name" HeaderText="Name" />
                <asp:BoundField DataField="LoadDate" HeaderText="Load Date" />
                <asp:BoundField DataField="EmployeeCutOffDate" HeaderText="Cut Off Date" />
                <asp:BoundField DataField="IsComplete" HeaderText="Is Completed" />
            </Columns>
        </asp:GridView>
    </ContentTemplate>
</asp:UpdatePanel>
38
Kevin Albrecht

すべてのLinkBut​​tonをAsyncPostBackTriggerとして登録する必要があります。 GridViewで各行がバインドされた後、LinkBut​​tonを検索し、次のようにコードビハインドで登録する必要があります。

protected void OrderGrid_RowDataBound(object sender, GridViewRowEventArgs e)  
{  
   LinkButton lb = e.Row.FindControl("MarkAsCompleteButton") as LinkButton;  
   ScriptManager.GetCurrent(this).RegisterAsyncPostBackControl(lb);  
}  

また、これには、 hereのおかげでリンクボタンにClientIDMode="AutoID"を設定する必要があります(RăzvanPanda これを指摘するため)。

78
NakedBrunch

おそらくお勧めしませんが、AsyncPostBackTriggerのEventNameを除外することにより、GridViewのすべてを非同期に動作させることができます。

<Triggers>
  <asp:AsyncPostBackTrigger ControlID="OrderGrid" />
</Triggers>

これにより、RowCommandイベントとGridView上のその他のイベントが非同期で発生します。 GridViewでClientIDMode = "Static"を作成すると、完全なポストバックが発生することにも注意してください。

5
Ewert

グリッドビューは条件付きモードです。

protected void gvAgendamentoExclui_RowDataBound(object sender, GridViewRowEventArgs e)
    {
        if (e.Row.RowType == DataControlRowType.DataRow) {
            LinkButton lnk = e.Row.FindControl("LinkButton2") as LinkButton;
            AsyncPostBackTrigger trigger = new AsyncPostBackTrigger();
            trigger.ControlID = lnk.UniqueID;
            trigger.EventName = "Click";
            UpdatePanel2.Triggers.Add(trigger);

        }
    }

そして、私が置いたリンクボタンのクリックイベントに:

protected void LinkButton2_Click(object sender, EventArgs e)
    {
        UpdatePanel2.Update();
    }
4
sahar

web.configファイルのsystem.web要素内に次の要素を配置

<xhtmlConformance mode="Transitional"/>
1
Sukhjeevan

1つのフォームが正常に動作する(page1)、別のフォーム全体がポストバック(page2)を行うという問題がありました。 2ページ目を作成したときに判明したのは、cut/pasteを少しやり過ぎていたのに、フォーム定義にjavascript呼び出しがまだあったことです。

< form id="form1" runat="server" onsubmit="return checkstuff();">

ただし、checkstuffpage 2で定義されていません。

onsubmitを削除し、部分的な投稿が機能し始めました。

作業ページ-ページ1では、checkstuffが定義されていましたが、単なるスタブであり、trueを返すだけでした。にやにや笑いのために、checkstuffにアラートを入れました。また、スタブを変更してfalseを返すだけでも、何も起こりませんでした。

これらすべてを指摘すると、まるでページ全体が送信されているかのように、javascriptが実行されます。クライアント側のスクリプトを再確認してください。

0
mike

これは古いかもしれませんが、私の解決策は、更新テンプレートをitemTemplate内に配置し、同様にgridviewの外部に配置することでした。

トリガーはgridviewで、外部トリガーはgridviewとPageIndexChangingである必要があります。やってみて.

0
user4014903

MSDNは、UpdatePanel.ChildrenAsTriggersプロパティが「[g] UpdatePanelコントロールの直接の子コントロールからのポストバックがパネルのコンテンツを更新するかどうかを示す値を設定または設定する」ことを指定しています( http://msdn.Microsoft.com/ en-us/library/system.web.ui.updatepanel.childrenastriggers.aspx )。

LinkBut​​tonは「即時の子コントロール」ではないように見えるため、LinkBut​​tonを明示的なAsyncPostBackTriggerとして構成することをお勧めします。

</ ContentTemplate>タグの下に、これを追加してみてください。

<Triggers>
  <asp:AsyncPostBackTrigger ControlID="MarkAsCompleteButton" EventName="Click" />
</Triggers>
0
Matthew Rodatus