2011-02-02 94 views
37

我在UpdatePanel裏面有一個GridView。在模板字段中是一個用於標記項目的按鈕。在功能上,這工作正常,但按鈕總是觸發一個完整的頁面回發,而不是部分回發。如何獲得按鈕以觸發部分回發?GridView裏面的LinkBut​​ton在UpdatePanel裏觸發全回發

<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> 
+0

我在一個新項目上創建了這個場景。我無法讓你的全部回發發生,每次都是部分回覆。你認爲在你的案例中有什麼其他因素是奇怪的嗎? – 2011-02-04 16:22:34

+0

你可以發佈你正在做的「MarkAsComplete」命令的代碼嗎? – 2011-02-04 16:24:33

+0

確保您沒有在Firefox上使用Web開發人員工具禁用所有JavaScript。 – Cem 2011-02-07 14:44:21

回答

71

你需要每一個註冊的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); 
} 

這也要求ClientIDMode="AutoID"爲LinkBut​​ton的設定,如提到here(感謝Răzvan Panda指出了這一點)。

+0

@Lionel提到了下面的一些內容,除了這個答案之外,我發現它非常有幫助。在`OrderGrid_RowDataBound`處理程序的內部,檢查當前行是否爲數據行是很明智的(因爲您正在查找的'LinkBut​​ton'可能不在標題行中)。如果(e.RowTypeRowType == DataControlRowType.DataRow) LinkBut​​ton lb = e.Row.FindControl(「MarkAsCompleteButton」)作爲LinkBut​​ton; ScriptManager.GetCurrent(this).RegisterAsyncPostBackControl(lb); } ` 否則,如果找不到該按鈕的ID,您將得到一個NPE。 – bradykey 2015-12-03 20:47:48

+0

如果你的Gridview不在UpdatePanel中,這是行不通的。改用** RowCreated **。 – gUIDo 2016-03-30 05:43:18

1

MSDN指定該UpdatePanel.ChildrenAsTriggers屬性「並[g] ETS或設置一個值,用於指示從一個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> 
+2

這不起作用,因爲該控件ID在行外不可見。 – 2011-02-09 08:05:24

1

把下面的元素system.web元素在裏面web.config文件

<xhtmlConformance mode="Transitional"/> 
5

它可能不建議,但你可以通過異步排除在AsyncPostBackTrigger的事件名稱,從而使例如在GridView上的一切工作

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

這將使RowCommand事件和GridView上的任何其他事件異步觸發。另請注意,當您在GridView上製作ClientIDMode =「Static」時,它將導致完整的回發。

+0

謝謝! `ClientIDMode =「Static」`是問題!當刪除它再次運作。 – Flo 2014-09-26 18:47:39

-1

您需要爲每個RowState註冊每個控件。 1:註冊您的控件的RowState =替換和正常) 2:註冊您的控件的RowState =編輯 3:...

ASPX:

<asp:TemplateField HeaderText=""> 
       <ItemTemplate> 
        <asp:LinkButton runat="server" ID="Btn1" 
         CommandName="Edit" CommandArgument='<%# Container.DataItemIndex + ";" + Eval("idinterlocuteur") %>'><i class="fa fa-pencil-square-o"></i></asp:LinkButton> 
       </ItemTemplate> 
       <EditItemTemplate> 
        <asp:LinkButton ID="Btn2" runat="server" CommandName="Update" CommandArgument='<%# Container.DataItemIndex + ";" + Eval("idinterlocuteur") %>'><i class="fa fa-check"></i></asp:LinkButton> 
       </EditItemTemplate> 
      </asp:TemplateField> 

後面的代碼:

protected void GridView_RowDataBound(object sender, GridViewRowEventArgs e) 
{ 
    if (e.Row.RowType == DataControlRowType.DataRow 
     && (e.Row.RowState == DataControlRowState.Normal 
      || e.Row.RowState == DataControlRowState.Alternate)) 
    { 
     LinkButton Btn1 = e.Row.FindControl("Btn1 ") as LinkButton; 
     ScriptManager.GetCurrent(this.Parent.Page).RegisterAsyncPostBackControl(Btn1); 
    } 
    if (e.Row.RowType == DataControlRowType.DataRow 
     && e.Row.RowState == DataControlRowState.Edit) 
    { 
     LinkButton Btn2 = e.Row.FindControl("Btn2 ") as LinkButton; 
     ScriptManager.GetCurrent(this.Parent.Page).RegisterAsyncPostBackControl(Btn2);  
    } 
} 
3

我的網格視圖處於條件模式。

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); 

     } 
    } 

而在LinkBut​​ton的Click事件,我把:

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

我有一個問題,我有一個形式工作的罰款(page1),另一個在做整個後背上(page2)。當我做第二頁時發現,我做了太多的cut/paste,它在表單定義中仍然有一個javascript調用。

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

但是checkstuff沒有在page 2中定義。

刪除了onsubmit,部分帖子開始工作。

在工作頁面 - 第1頁中,checkstuff已被定義,但只是一個存根,除了返回true之外沒有任何作用。只是爲了咧嘴笑,我在checkstuff中發出了一個提醒,果然,它被要求提交所有提交,部分或不提供。而且,如果我將存根改爲僅僅返回false,則什麼都沒有發生。

指出這一切,JavaScript仍然行使,就像正在提交一個完整的頁面。所以仔細檢查你的客戶端腳本。

0

這可能是舊的,但我的解決方案是將一個更新面板放在itemTemplate內,另一個放在gridview外面。

觸發器應該是gridview,而外部觸發器應該是gridview和PageIndexChanging。試試看。

相關問題