![](/img/trans.png)
[英]Hide a LinkButton inside an UpdatePanel, which is inside a GridView
[英]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>
您需要将每个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);
}
这也要求ClientIDMode="AutoID"
为LinkButton的设定,如提到这里 (感谢的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 )。
由于您的LinkButton似乎不是“直接子控件”,因此我建议将LinkButton配置为显式的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.