GridView的LinkButton无法使外部UpdatePanel刷新。

4
我有一个包含GridView的普通面板的ASP页面。GridView中有一些链接按钮,用于生成PDF。
我还在普通面板内部并且GridView下方添加了一个UpdatePanel,其中包含一个标签。
当用户点击GridView内部的“生成”链接按钮时,我希望该标签显示“正在生成报告”等内容。
但是我一直无法让其正常工作。我可以随意向标签中添加值,但没有效果。
以下是该面板的代码:
<asp:Panel ID="ReportsPanel" runat="server" Height="611px">
    <h2>
        Reports
    </h2>
    <asp:Label ID="ReportsNotification" runat="server"></asp:Label>
    <br />
    <asp:Label ID="Label1" runat="server" Text="Pharmacy: "></asp:Label>
    <asp:DropDownList ID="PharmaciesDropDownList" runat="server" AutoPostBack="true"
        OnSelectedIndexChanged="PharmaciesDropDownList_SelectedIndexChanged">
    </asp:DropDownList>
    <br />
    <br />
    <asp:GridView ID="ListReportsGridView" runat="server" AllowPaging="true" AllowSorting="true"
        GridLines="None" PageSize="10" CssClass="GridView" AutoGenerateColumns="false"
        EmptyDataText="No rows for selection." OnRowCommand="ListReportsGridView_RowCommand"
        OnPageIndexChanging="ListReportsGridView_PageIndexChanging"
        EnablePersistedSelection="True"
        DataKeyNames="FinDataID">
        <AlternatingRowStyle CssClass="GridViewAltRow" />
        <HeaderStyle CssClass="GridViewHeader" />
        <RowStyle CssClass="GridViewItem" />
        <PagerStyle CssClass="GridViewPager" />
        <Columns>
            <asp:BoundField DataField="ID" HeaderText="ID" ControlStyle-CssClass="Hidden" ItemStyle-CssClass="Hidden"
                HeaderStyle-CssClass="Hidden" FooterStyle-CssClass="Hidden" />
            <asp:BoundField DataField="FinDataID" HeaderText="FinDataID" ControlStyle-CssClass="Hidden" ItemStyle-CssClass="Hidden"
                HeaderStyle-CssClass="Hidden" FooterStyle-CssClass="Hidden" />
            <asp:BoundField DataField="PeriodStart" HeaderText="Period Start" DataFormatString="{0:dd/MM/yyyy}" />
            <asp:BoundField DataField="PeriodEnd" HeaderText="Period End" DataFormatString="{0:dd/MM/yyyy}" />
            <asp:TemplateField HeaderText="Reports Available for Download"><ItemTemplate><asp:LinkButton ID="LinkButtonViewRpt" Text='<%#Eval("FileName") %>' CommandName="ViewRpt" CommandArgument="<%# Container.DataItemIndex %>" runat="server"></asp:LinkButton></ItemTemplate></asp:TemplateField>    
            <asp:TemplateField Visible="false"><ItemTemplate><asp:LinkButton ID="LinkButtonGenerateRpt" Text='Generate' CommandName="GenerateRpt" CommandArgument="<%# Container.DataItemIndex %>" runat="server"></asp:LinkButton></ItemTemplate></asp:TemplateField>    
            <asp:TemplateField Visible="false"><ItemTemplate><asp:LinkButton ID="LinkButtonUploadRpt" Text='Upload' CommandName="UploadRpt" CommandArgument="<%# Container.DataItemIndex %>" runat="server"></asp:LinkButton></ItemTemplate></asp:TemplateField>    
        </Columns>
    </asp:GridView>
    <asp:UpdatePanel ID="UpdatePanel1" runat="server" UpdateMode="Conditional">
        <Triggers>
            <asp:AsyncPostBackTrigger ControlID="LinkButtonGenerateRpt" EventName="Click" />
        </Triggers>
        <ContentTemplate>
            <asp:Label ID="lblMessage" runat="server" Text=""></asp:Label>
        </ContentTemplate>
    </asp:UpdatePanel>
    <br />
</asp:Panel>

我已经尝试了在UpdatePanel中和在UpdatePanel之外都使用按钮,但这些想法都没有奏效。这肯定是有可能的!

唯一让我感到疑惑的是,在“生成”按钮触发并创建PDF时,它调用了Response.End。我知道这将结束线程并且不会重新加载页面。但我希望在此之前可以刷新UpdatePanel...从我所了解的情况来看,这就是UpdatePanel的作用,进行部分页面更新。

以下是GridView的后台代码:

protected void ListReportsGridView_RowCommand(object sender, GridViewCommandEventArgs e)
{
    intIndex = Convert.ToInt32(e.CommandArgument);
    if (e.CommandName == "GenerateRpt")
    {//render pdf

        //populate empty report object with row information
        objFileData = new FileData();
        objFileData.PharmacyID = Convert.ToInt32(PharmaciesDropDownList.SelectedValue);
        objFileData.FinDataID = Convert.ToInt32(ListReportsGridView.Rows[intIndex].Cells[1].Text);
        objFileData.CreateDate = Convert.ToDateTime(DateTime.Now);
        objFileData.CreatedByID = Convert.ToInt32(Session["UserID"]);
        objFileData.PeriodStart = Convert.ToDateTime(ListReportsGridView.Rows[intIndex].Cells[2].Text);

        lblMessage.Text = "Report generating...";
        //btnGenerate_Click(sender, e);
        RenderPdf();

    }

提前感谢!

编辑:我还收到了以下错误信息...

在UpdatePanel 'UpdatePanel1'的触发器中找不到ID为'LinkButtonGenerateRpt'的控件。

我需要使用UniqueID吗?还是作用域存在问题?


在答案下面我添加了一条评论。 - Kiarash
2个回答

4
您的UpdatePanel的UpdateMode是有条件的,您必须手动触发更新,因此当您需要更新时,必须执行UpdatePanel1.Update()命令。

1
好的,我之前在一个按钮测试中就是这么做的,只是在做了一些其他更改后忘记放回去了。谢谢!还有,请参见上面编辑的错误信息... - s.bramblet
最后它解决了你的问题吗? - Kiarash
好的,LinkButtonGenerateRpt是您的按钮名称,但问题在于您的按钮将被创建多次(每行一次),因此它每次都会有不同的动态名称,所以只需从updatepanel中删除触发器,并按照我提到的使用UpdatePanel1.Update()更新您的面板即可。 - Kiarash
再次感谢!我已经删除了触发器,因为现在我不需要它们。没有错误,我的代码正在执行,但是我仍然看不到UpdatePanel中的标签文本...现在不确定出了什么问题。 - s.bramblet

3
您不能将位于不同命名容器中的按钮设置为updatepanel的触发器。这就是您收到错误信息的原因:A control with ID 'LinkButtonGenerateRpt' could not be found for the trigger in UpdatePanel 'UpdatePanel1

如果您确实想让Linkbutton成为触发器,则需要使用ScriptManager.RegisterAsyncPostBackControl方法,即使以编程方式添加AsyncPostBackTrigger控件也不受支持。

您可以处理GridView的OnRowCreated事件,并为每个LinkButton调用ScriptManager.RegisterAsyncPostBackControl。通过findcontrol方法找出控件。然后在链接按钮的OnClick事件处理程序中调用UpdatePanel.Update()来更新它。

GridView标记(仅显示下面的Linkbutton)。为您的链接按钮定义一个OnClick事件。

<asp:TemplateField Visible="false">
<ItemTemplate>
<asp:LinkButton ID="LinkButtonGenerateRpt" Text='Generate' 
     CommandName="GenerateRpt" 
     CommandArgument="<%# Container.DataItemIndex %>" 
     OnClick="LinkButtonGenerateRpt_Click"runat="server">
    </asp:LinkButton>
</ItemTemplate>
</asp:TemplateField>

// Grid View的行创建事件。在这里,您将链接按钮注册为异步回发触发器

protected void ListReportsGridView_RowCreated(object sender, GridViewRowEventArgs e)
 {
    Control lnkBtnControl = e.Row.Cells[5].FindControl("LinkButtonGenerateRpt");
       if (lnkBtnControl!= null)
         {
            ScriptManager1.RegisterAsyncPostBackControl(lnkBtnControl );
         }    
 }

在单击 LinkButton 时更新 UpdatePanel,代码如下:
protected void LinkButtonGenerateRpt_Click(object sender, EventArgs e)
        {

            UpdatePanel1.Update();

        }

谢谢@FlopScientist...我已经尝试了那种方法,但不幸的是,此页面的ScriptManager位于Site.Master页中,因此我无法引用它。如果不是这个问题,就是另一个问题! - s.bramblet
我找到了解决我的ScriptManager问题的代码: ScriptManager scriptManager = ScriptManager.GetCurrent(this.Page); 然而,现在当我点击其他按钮时,它不会调用gridview上的RowCommand,并且当它完成RowCreated过程后,我的gridview上的DataBind由于无效索引而失败... - s.bramblet

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接