【问题标题】:Pdf Viewer refreshes during page index change of gridview on asp.net pagepdf查看器在asp.net页面上gridview的页面索引更改期间刷新
【发布时间】:2015-02-10 19:00:08
【问题描述】:

我在一个带有两个链接按钮的 asp.net 页面上有一个 gridview - 一个用于查看 pdf,一个用于下载。当您单击查看时,pdf 查看器将显示在文字控件中。这工作正常。但是我为我的 gridview 启用了分页,当我单击分页链接时,pdf 显示会刷新,这意味着它将重新加载上次查看的 pdf。我猜它与回发有关,但无法找到解决方案。

<div id="wpaLinks" style="height: 118px;">
            <asp:UpdatePanel ID="UpdatePanel2" runat="server">                         
                <ContentTemplate>
                    <asp:GridView ID="gvWPAs" runat="server" AutoGenerateColumns="False" AllowPaging="true" PageSize="3" CssClass="Grid" AlternatingRowStyle-CssClass="alt"  
                        PagerStyle-CssClass="pgr" EmptyDataText="No Records Found" OnPageIndexChanging="gvWPAs_PageIndexChanging">  <%--OnRowDataBound="gvWPAs_RowDataBound"--%>
                            <AlternatingRowStyle CssClass="alt" />
                            <Columns>
                                <asp:BoundField DataField="fileDescription" HeaderText="File Description" />
                                <asp:TemplateField ItemStyle-HorizontalAlign="Center">
                                    <ItemTemplate>
                                        <asp:LinkButton ID="lnkView" runat="server" Text="View" OnClick="View" CommandArgument='<%# Eval("relPath") %>'></asp:LinkButton>
                                        <asp:LinkButton ID="lnkDownload" Text="Download" CommandArgument='<%# Eval("relPath") %>' runat="server" OnClick="DownloadFile"></asp:LinkButton>
                                    </ItemTemplate>
                                    <ItemStyle HorizontalAlign="Center" />
                                </asp:TemplateField>
                            </Columns>
                        <PagerSettings FirstPageText="First" LastPageText="Last" Mode="NumericFirstLast" PageButtonCount="4" />
                        <PagerStyle CssClass="pgr" />
                    </asp:GridView>
                </ContentTemplate>
            </asp:UpdatePanel>
            </div>


            <asp:UpdatePanel ID="UpdatePanel3" runat="server">
                <ContentTemplate>
                    <asp:Literal ID="ltEmbed" runat="server" />
                </ContentTemplate>
            </asp:UpdatePanel>

后面的代码是....

protected void gvWPAs_PageIndexChanging(object sender, GridViewPageEventArgs e)
{
    gvWPAs.PageIndex = e.NewPageIndex;
    var ctyID = CountyList.SelectedValue;
    var twnID = TwnList.SelectedValue;
    var rngID = RngList.SelectedValue;

    if (ctyID != "0" & twnID == "0" & rngID == "0") // County only
    {
        dsGetCtyWPAs.SelectParameters["ctyID"].DefaultValue = ctyID;
        DataView dvCtyWpa = (DataView)dsGetCtyWPAs.Select(DataSourceSelectArguments.Empty);
        //DataTable dtCtyWpa = dvCtyWpa.ToTable();
        gvWPAs.DataSource = dvCtyWpa;
        gvWPAs.DataBind();
        this.RegisterPostBackControl();
    }

}


protected void View(object sender, EventArgs e)
{
    string pdfIdentifier = (sender as LinkButton).CommandArgument;
    string embed = "<object data=\"{0}{1}\" type=\"application/pdf\" width=\"650px\" height=\"850px\">";
    embed += "If you are unable to view file, you can download from <a href = \"{0}{1}&download=1\">here</a>";
    embed += " or download <a target = \"_blank\" href = \"http://get.adobe.com/reader/\">Adobe PDF Reader</a> to view the file.";
    embed += "</object>";
    ltEmbed.Text = string.Format(embed, ResolveUrl("~/PdfHandler.ashx?pdfPath="), "WpaFiles/" + pdfIdentifier);

}



protected void DownloadFile(object sender, EventArgs e)
{
    string filePath = (sender as LinkButton).CommandArgument;        
    string fileName = Path.GetFileName(filePath);        
    Downloader.Download(fileName, "WpaFiles/" + filePath);
}

【问题讨论】:

  • 当你通过代码..并且你点击第二个链接..它首先进入Page_Load事件..?如果是这样,那么您发生了一些 AutoPostBack,或者您需要编码/检查 If(IsPostBack){}
  • @MethodMan:每次回发都会导致整个页面的生命周期发生。所以每次回发都会引发Page_Load,即使使用UpdatePanel。根据上面的代码,UpdatePanel 默认为ChildrenAsTriggers="True"UpdateMode="Always",所以无论你点击什么按钮,几乎所有事情都会导致回发。
  • 他正在使用更新面板@fnostro
  • 是的 - 两次 - 我可以看到。您是否暗示不会发生完整的回发?

标签: c# asp.net pdf gridview


【解决方案1】:

您的代码重新显示 pdf 的原因是第二个 UpdatePanel 未更新/清除。

虽然嵌入在UpdatePanel 中的控件仍会导致整个页面的生命周期发生 - 关于它们的好处是它们只会传回更改。因此,当您在第一个 UpdatePanel 中更改页面时,您不会清除第二个中的嵌入代码。这可能需要也可能不需要。

在页面更改时,您需要清除第二个更新面板中的嵌入代码并确保该面板得到更新

【讨论】:

  • 所以我唯一的选择是太清楚第二个更新面板 - 当我对第一个更新面板的网格视图使用分页时,没有办法维护文本中显示的 pdf?
  • 好的 - 我看到你想通了 - 恭喜 :)
【解决方案2】:

我在 UpdatePanel3 上将 UpdateMode 设置为 Conditional

 <asp:UpdatePanel ID="UpdatePanel3" runat="server" UpdateMode="Conditional">                     
                <ContentTemplate>
                    <asp:Literal ID="ltEmbed" runat="server" />
                </ContentTemplate>
            </asp:UpdatePanel>

然后将 UpdatePanel3.Update() 添加到....

protected void View(object sender, EventArgs e)
{
string pdfIdentifier = (sender as LinkButton).CommandArgument;
string embed = "<object data=\"{0}{1}\" type=\"application/pdf\" width=\"650px\" height=\"850px\">";
embed += "If you are unable to view file, you can download from <a href = \"{0}{1}&download=1\">here</a>";
embed += " or download <a target = \"_blank\" href = \"http://get.adobe.com/reader/\">Adobe PDF Reader</a> to view the file.";
embed += "</object>";
ltEmbed.Text = string.Format(embed, ResolveUrl("~/PdfHandler.ashx?pdfPath="), "WpaFiles/" + pdfIdentifier);
UpdatePanel3.Update();
}

【讨论】:

    猜你喜欢
    • 2011-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-22
    • 2018-12-08
    相关资源
    最近更新 更多