2011-02-02 96 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。试试看。

相关问题