繁体   English   中英

由UpdatePanel内的GridView内的LinkBut​​ton触发的完整回发

[英]Full postback triggered by LinkButton inside GridView inside UpdatePanel

我在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>

您需要将每个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的设定,如提到这里 (感谢的Răzvan熊猫指出这一点)。

可能没有建议,但你可以通过排除AsyncPostBackTrigger上的EventName来使GridView上的所有内容异步工作,例如

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

这将使GridView上的RowCommand事件和任何其他事件异步触发。 另请注意,当您在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);

        }
    }

在链接按钮的click事件中,我把:

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

将以下元素放在web.config文件中的system.web元素中

<xhtmlConformance mode="Transitional"/>

我有一个问题,我有一个形式工作的罚款( page1 ),另一个在做整个后背上( page2 )。 当我进入第二页时,我做了一些cut/paste太多了,它仍然在表单定义中有一个javascript调用。

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

但是page 2没有定义checkstuff

删除了onsubmit ,部分帖子开始工作了。

在工作页面 - 第1页, checkstuff被定义,但只是一个存根,它只是返回true。 只是为了笑容,我在checkstuff发出警报, 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 )。

由于您的LinkBut​​ton似乎不是“直接子控件”,因此我建议将LinkBut​​ton配置为显式的AsyncPostBackTrigger。

在</ ContentTemplate>标记下方,尝试添加以下内容:

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

您需要为每个RowState注册每个控件。 1:为RowState = Alternate和Normal注册控件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 );      
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM