gpt4 book ai didi

asp.net - 如何配置 GridView CommandField 以触发 UpdatePanel 中的整页更新

转载 作者:行者123 更新时间:2023-12-02 12:04:24 29 4
gpt4 key购买 nike

我的页面上有 2 个用户控件。一个用于搜索,另一个用于编辑(以及其他一些东西)。

提供搜索功能的用户控件使用 GridView 来显示搜索结果。此 GridView 有一个用于编辑的 CommandField (showEditButton="true")。

我想将 GridView 放入 UpdatePanel 中,以便对搜索结果进行顺利分页。

问题是,当用户单击编辑链接(CommandField)时,我需要执行整页回发,以便可以隐藏搜索用户控件并显示编辑用户控件。

编辑:我需要进行整页回发的原因是因为编辑用户控件位于我的 GridView 所在的 UpdatePanel 之外。它不仅位于 UpdatePanel 之外,而且位于完全不同的用户控件。

我不知道如何将 CommandField 作为整页回发触发器添加到 UpdatePanel。 PostBackTrigger(用于指示引起整页回发的控件)采用 ControlID 作为参数;但是 CommandButton 没有 ID...您可以看到为什么我遇到此问题。

更新我还尝试解决该问题的方法:我采取了一种新的方法来解决这个问题。

在我的新方法中,我使用了 TemplateField 而不是 CommandField。我在 TemplateField 中放置了一个 LinkBut​​ton 控件并为其命名。在 GridView 的 RowDataBound 事件期间,我检索了 LinkBut​​ton 控件并将其添加到 UpdatePanel 的触发器中。

这是 UpdatePanel 和 GridView 的 ASP 标记

<asp:UpdatePanel ID="SearchResultsUpdateSection" runat="server">
<ContentTemplate>
<asp:GridView ID="SearchResultsGrid" runat="server"
AllowPaging="true"
AutoGenerateColumns="false">
<Columns>
<asp:TemplateField>
<HeaderTemplate></HeaderTemplate>
<ItemTemplate>
<asp:LinkButton ID="Edit" runat="server" Text="Edit"></asp:LinkButton>
</ItemTemplate>
</asp:TemplateField>
<asp:BoundField ......
</Columns>
</asp:GridView>
</ContentTemplate>
</asp:UpdatePanel>

在我的 VB.NET 代码中。我实现了一个处理 GridView 的 RowDataBound 事件的函数。在此方法中,我找到绑定(bind)到的行的 LinkBut​​ton,为 LinkBut​​ton 创建 PostBackTrigger,并将其添加到 UpdatePanel 的触发器中。 这意味着为 GridView 中的每个“编辑”LinkBut​​ton 创建一个 PostBackTrigger 编辑:这不会为每个“编辑”LinkBut​​ton 创建 PostBackTrigger,因为 ID 相同对于 GridView 中的所有 LinkBut​​ton。

Private Sub SearchResultsGrid_RowDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewRowEventArgs) Handles SearchResultsGrod.RowDataBound
If e.Row.RowType = DataControlRowType.Header Then
''I am doing stuff here that does not pertain to the problem
Else
Dim editLink As LinkButton = CType(e.Row.FindControl("Edit"), LinkButton)
If editLink IsNot Nothing Then
Dim fullPageTrigger As New PostBackTrigger
fullPageTrigger.ControlID = editLink.ID
SearchResultsUpdateSection.Triggers.Add(fullPageTrigger)
End If

End If
End Sub

我没有为了编辑目的而处理 GridView 的 RowEditing 事件,而是使用 RowCommand。

Private Sub SearchResultsGrid_RowCommand(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewCommandEventArgs) Handles SearchResultsGrid.RowCommand
RaiseEvent EditRecord(Me, New EventArgs())
End Sub

这种新方法根本不起作用,因为 GridView 中的所有 LinkBut​​ton 都具有相同的 ID。

阅读关于 UpdatePanel.Triggers Property 的 MSDN 文章后我的印象是触发器只能以声明方式定义。这意味着我在 VB 代码中所做的任何事情都不起作用。

如有任何建议,我们将不胜感激。

谢谢

-弗林尼

最佳答案

要将控件注册为回发触发器,请使用 ScriptManager 的 RegisterPostBackControl 方法。

     If editLink IsNot Nothing Then
ScriptManager.GetCurrent(this.Page).RegisterPostBackControl(editLink )
End If

此方法也适用于在其他控件中动态添加的控件。我的 GridView 也有同样的问题。我已经注册了 TemplatedField 行的 linkBut​​ton 和 imageButton。

我使用 RowCreated Gridview 的处理程序而不是 RowDataBound 处理程序:RowCreated专注于解析Gridview行的定义并创建Gridview行的控制结构,RowDataBound 专注于将数据绑定(bind)到在 RowCreated 中创建的行控件。此外,RowCreated 在 init 和 postback 情况下都会自动调用,但 RowDataBound 仅在调用 DataBind 时才会调用。代码

<asp:GridView ID="ContactsGridView" runat="server" AutoGenerateColumns="False"
DataSourceID="ContactsContainerDataSource" EnableViewState="false"
DataKeyNames="CompanyID,ContactId" AllowSorting="True" AllowPaging="true"
OnRowCreated="ContactsGridView_RowCreated" PageSize="10" CssClass="GridSimple"
OnRowCommand="ContactsGridView_RowCommand">
<Columns>
<asp:TemplateField HeaderStyle-CssClass="large" HeaderText="Contact" SortExpression="ContactNom">
<ItemTemplate>
<asp:ImageButton ID="PreviewImageButton" runat="server" ImageUrl="../images/picto_pdf.gif"
CommandName="PreviewContact" CommandArgument=<%#Eval("ContactCode") %> BorderWidth="0"
ToolTip="View Pdf Document" />
<asp:LinkButton ID="ContactNamePreviewLinkButton" runat="server" CommandName="Select"
CommandArgument='<%#Eval("ContactCode") %>'><%#Eval("ContactName")%></asp:LinkButton>
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>




protected void ContactsGridView_RowCreated(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.DataRow)
{
//Register download buttons as PostBack controls (instead of AsyncPostback because of their updatepanel container))
ImageButton ib = (ImageButton)e.Row.FindControl("PreviewImageButton");
if (ib != null) ScriptManager.GetCurrent(this.Page).RegisterPostBackControl(ib);
LinkButton lb = (LinkButton)e.Row.FindControl("ContactNamePreviewLinkButton");
if (lb != null) ScriptManager.GetCurrent(this.Page).RegisterPostBackControl(lb);
}

}
protected void ContactsGridView_RowCommand(object sender, GridViewCommandEventArgs e)
{
if (e.CommandName == "PreviewContact")
{

_presenter.OnPreviewContactClicked((string)e.CommandArgument);
}
}

关于asp.net - 如何配置 GridView CommandField 以触发 UpdatePanel 中的整页更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1289958/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com