4

我有一个包含gridview 的常规面板的asp 页面。gridview 有一些用于生成 pdf 的链接按钮。

我在常规面板内和包含标签的网格视图下方也有一个 UpdatePanel。

当用户单击网格视图内的“生成”链接按钮时,我希望标签显示“报告生成”或类似的内容。

我根本无法让它工作。我可以整天将值放入标签中,什么也没有。

这是面板的代码:

<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 中使用一个按钮,但这些想法都没有奏效。这当然是可能的!

我想知道的一件事是,当“生成”按钮触发并创建它调用 Response.End 的 pdf 时。我知道这将结束线程并且不会重新加载页面。但我希望我能在这种情况发生之前刷新 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 为“LinkBut​​tonGenerateRpt”的控件。

我是否需要使用 UniqueID 或范围是其他问题?

4

2 回答 2

4

UpdateMode 的更新面板是有条件的,您必须自己触发更新,因此当您需要更新时,您必须说UpdatePanel1.Update();

于 2013-10-18T05:14:35.030 回答
3

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

如果您真的希望Linkbutton成为触发器,则需要使用方法,甚至不支持以ScriptManager.RegisterAsyncPostBackControl编程方式添加控件。AsyncPostBackTrigger

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

GridView 标记(仅如下所示的链接按钮)。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 的 RowCreated 事件。在这里,您将链接按钮注册为异步回发触发器

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

并将 LinkBut​​ton 上的 UpdatePanel 更新为:

protected void LinkButtonGenerateRpt_Click(object sender, EventArgs e)
        {

            UpdatePanel1.Update();

        }
于 2013-10-18T08:40:47.207 回答