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>
すべてのLinkButtonをAsyncPostBackTrigger
として登録する必要があります。 GridViewで各行がバインドされた後、LinkButtonを検索し、次のようにコードビハインドで登録する必要があります。
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 これを指摘するため)。
おそらくお勧めしませんが、AsyncPostBackTriggerのEventNameを除外することにより、GridViewのすべてを非同期に動作させることができます。
<Triggers>
<asp:AsyncPostBackTrigger ControlID="OrderGrid" />
</Triggers>
これにより、RowCommandイベントとGridView上のその他のイベントが非同期で発生します。 GridViewでClientIDMode = "Static"を作成すると、完全なポストバックが発生することにも注意してください。
グリッドビューは条件付きモードです。
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();
}
web.configファイルのsystem.web要素内に次の要素を配置
<xhtmlConformance mode="Transitional"/>
1つのフォームが正常に動作する(page1
)、別のフォーム全体がポストバック(page2
)を行うという問題がありました。 2ページ目を作成したときに判明したのは、cut/paste
を少しやり過ぎていたのに、フォーム定義にjavascript
呼び出しがまだあったことです。
< form id="form1" runat="server" onsubmit="return checkstuff();">
ただし、checkstuff
はpage 2
で定義されていません。
onsubmit
を削除し、部分的な投稿が機能し始めました。
作業ページ-ページ1では、checkstuff
が定義されていましたが、単なるスタブであり、trueを返すだけでした。にやにや笑いのために、checkstuff
にアラートを入れました。また、スタブを変更してfalseを返すだけでも、何も起こりませんでした。
これらすべてを指摘すると、まるでページ全体が送信されているかのように、javascriptが実行されます。クライアント側のスクリプトを再確認してください。
これは古いかもしれませんが、私の解決策は、更新テンプレートをitemTemplate内に配置し、同様にgridviewの外部に配置することでした。
トリガーはgridviewで、外部トリガーはgridviewとPageIndexChangingである必要があります。やってみて.
MSDNは、UpdatePanel.ChildrenAsTriggersプロパティが「[g] UpdatePanelコントロールの直接の子コントロールからのポストバックがパネルのコンテンツを更新するかどうかを示す値を設定または設定する」ことを指定しています( http://msdn.Microsoft.com/ en-us/library/system.web.ui.updatepanel.childrenastriggers.aspx )。
LinkButtonは「即時の子コントロール」ではないように見えるため、LinkButtonを明示的なAsyncPostBackTriggerとして構成することをお勧めします。
</ ContentTemplate>タグの下に、これを追加してみてください。
<Triggers>
<asp:AsyncPostBackTrigger ControlID="MarkAsCompleteButton" EventName="Click" />
</Triggers>