【问题标题】:UserControl Export GridView to PDFUserControl 将 GridView 导出为 PDF
【发布时间】:2014-01-09 13:39:39
【问题描述】:

我有一个 UserControl,我正在尝试将我的 GridView 表导出为 PDF。我可以很好地制作 CSV 文件,但在尝试制作 PDF 时出现错误。 (我正在使用 iTextSharp 库)这是我得到的错误:

“'GridView' 类型的控件 'DoNotAddList_1_GridView1' 必须放在带有 runat=server 的表单标签内。”

我的 html 中有一个表单标签,我尝试将它添加到 ascx 文件中,但没有任何效果。我发现很多人收到此错误,大多数人都建议将其添加到 ascx.cs 文件的代码中:

public override void VerifyRenderingInServerForm(Control control) {     }

但这给了我这个错误“找不到合适的方法来覆盖......”

我不知道该怎么办。我一直无法找到解决方案。请帮忙!!

using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.IO;
using iTextSharp.text;
using iTextSharp.text.pdf;
using iTextSharp.text.html;
using iTextSharp.text.html.simpleparser;

public partial class UserControls_DoNotAddListControl : System.Web.UI.UserControl
{
protected void PDF_Click(object sender, EventArgs e)
{   
    Response.ContentType = "application/pdf";
    Response.AddHeader("content-disposition",
     "attachment;filename=GridViewExport.pdf");
    Response.Cache.SetCacheability(HttpCacheability.NoCache);
    StringWriter sw = new StringWriter();
    HtmlTextWriter hw = new HtmlTextWriter(sw);
    GridView1.AllowPaging = false;
    GridView1.DataBind();
    GridView1.RenderControl(hw);
    StringReader sr = new StringReader(sw.ToString());
    Document pdfDoc = new Document(PageSize.A4, 10f, 10f, 10f, 0f);
    HTMLWorker htmlparser = new HTMLWorker(pdfDoc);
    PdfWriter.GetInstance(pdfDoc, Response.OutputStream);
    pdfDoc.Open();
    htmlparser.Parse(sr);
    pdfDoc.Close();
    Response.Write(pdfDoc);
    Response.End();
}
protected void CSV_Click(object sender, EventArgs e)
{
     Response.ClearContent();
    Response.AddHeader("content-disposition", string.Format("attachment; filename={0}", "BloombergDaily.csv"));
    Response.ContentType = "application/text";
    GridView1.AllowPaging = false;
    GridView1.DataBind();
    StringBuilder strbldr = new StringBuilder();
    for (int i = 0; i < GridView1.Columns.Count; i++)
    {
        strbldr.Append(GridView1.Columns[i].HeaderText + ',');
    }
    strbldr.Append("\n");
    for (int j = 0; j < GridView1.Rows.Count; j++)
    {
        for (int k = 0; k < GridView1.Columns.Count; k++)
        {
            strbldr.Append(GridView1.Rows[j].Cells[k].Text + ',');
        }
        strbldr.Append("\n");
    }
    Response.Write(strbldr.ToString());
    Response.End();
}
}

这是我在 aspx 文件中的内容:

<form id="form1" runat="server" action="/">          
        <div id="donotadd" class="tableWrapper">
            <div id="tabs1">
                <p>
                    <div id="tabs-1" >                           
                        <div id="DoNotAddListMacro" class="dataTable table_Center">
                        <umbraco:Macro ID="Macro1" Alias="DoNotAddListControl" runat="server"></umbraco:Macro>
                        </div>                                                                          
                    </div>   
                </p>
            </div>    
        </div>            
    </form> 

【问题讨论】:

    标签: c# asp.net pdf gridview itextsharp


    【解决方案1】:

    我知道这可能来自左侧字段,但是您是否将用户控件放在带有 runat="server" 属性的表单标签内?

    <form runat="server">
    <myprefix:MyControl runat="server" />
    </form>
    

    【讨论】:

      【解决方案2】:

      不久前我遇到了同样的情况。我看到您已经覆盖了以下方法。但是你把那个方法放在你的用户控件中了吗?这会给你“找不到合适的方法来覆盖”。需要在您将删除用户控件的 .aspx.cs 文件中覆盖此方法。

      具有 ExportPdf() 方法的 UserControl 背后的她的代码

       protected void btnExportPdf_Click(object sender, EventArgs e)
          {
              System.Threading.Thread.Sleep(1000);
              ExportPdf();
          }
      
          protected void ExportPdf()
          {
              using (StringWriter sw = new StringWriter())
              {
                  using (HtmlTextWriter hw = new HtmlTextWriter(sw))
                  {
                      //To export all pages
                      gvCharges.AllowPaging = false;
                      this.BindRepeater();
      
                      gvCharges.RenderControl(hw);
                      StringReader sr = new StringReader(sw.ToString());
                      Document pdfDoc = new Document(PageSize.A2, 10f, 10f, 10f, 0f);
                      HTMLWorker htmlparser = new HTMLWorker(pdfDoc);
                      PdfWriter.GetInstance(pdfDoc, Response.OutputStream);
                      pdfDoc.Open();
                      htmlparser.Parse(sr);
                      pdfDoc.Close();
      
                      Response.ContentType = "application/pdf";
                      Response.AddHeader("content-disposition", "attachment;filename=GridViewExport.pdf");
                      Response.Cache.SetCacheability(HttpCacheability.NoCache);
                      Response.Write(pdfDoc);
                      Response.End();
                  }
              }
          }
      

      这是 .ascx 文件的来源

      <asp:Button ID="btnExportPdf" runat="server" Text="Export to pdf" Visible = "false" 
          onclick="btnExportPdf_Click" CssClass="btn btn-primary" />
      

      这是 .aspx 的源代码,我将用户控件放到该位置

       <div class="form-section-body">
           <table style="width: 100%">
               <tr>
                   <td colspan="2" style="padding: 20px 5px 5px 5px;">
                       <uc2:PosTrans ID="PosTrans1" runat="server" />
                   </td>
               </tr>
           </table>
       </div>
      

      这是 .aspx.cs 背后的代码,我将用户控件放到其中

       namespace DFM.Dashboard
      {
          public partial class Dashboard : System.Web.UI.Page
          {
              protected void Page_Load(object sender, EventArgs e)
              {
      
              }
      
              public override void VerifyRenderingInServerForm(Control control)
              {
                  /* Verifies that the control is rendered */
              }
          }
      

      }

      【讨论】:

      • 我应该把它放在哪里?我尝试在&lt;div id="tabs-1" &gt; &lt;/div&gt; 中添加它,但它给了我一个编译错误。
      • 您必须将该方法放在 .aspx 文件而不是 .aspx 文件后面的代码中。 .aspx.cs。如果这不起作用,请告诉我。
      • 看起来它可能会起作用。我无法让 aspx 和 aspx.cs 文件一起工作。我收到一条错误消息,提示“'Masterpages_MyWebForm' 类型的声明缺少部分修饰符;此类型的另一个部分声明存在”。我的班级有public class Masterpages_MyWebForm : System.Web.UI.Page{}。这在我的 aspx 文件中&lt;%@Language="C#" CodeFile="~/Masterpages/webform.aspx.cs" Inherits="Masterpages_MyWebForm" %&gt;
      • 您的类声明中可能缺少部分标识符。尝试公共部分类 Masterpages_MyWebForm: System.Web.UI.Page{ }
      • 好的,我添加了partial,现在我得到“CS1061:不包含'BtnPDF_Click'的定义并且没有扩展方法......”我不是确定我做错了什么。
      【解决方案3】:

      试试这个。相应地替换控件类型

      public override void VerifyRenderingInServerForm(Control control)
           {
               Macro grid = control as Macro ;
               if (grid != null && grid.ID == "Macro1")
                   return;
               else
                   base.VerifyRenderingInServerForm(control);
      
           }
      

      更新 查看以下链接以获取完整示例

      Export Html to Pdf using iTextSharp(GridView)

      【讨论】:

        【解决方案4】:

        这是我找到的解决方案:

        protected void BtnPDF_Click(object sender, EventArgs e)
            {
                GridView gv = new GridView();
                gv.DataSource = SqlDataSource1;
                gv.DataBind();
                StringWriter sw = new StringWriter();
                HtmlTextWriter htw = new HtmlTextWriter(sw);
        
                gv.RenderControl(htw);
        
                var mem = new MemoryStream();
        
                Document document = new Document(PageSize.LETTER, 50, 50, 50, 50);
                PdfWriter.GetInstance(document,mem);
        
                document.Open();
        
                iTextSharp.text.html.simpleparser.HTMLWorker hw = new iTextSharp.text.html.simpleparser.HTMLWorker(document);
                hw.Parse(new StringReader(sw.ToString()));
                document.Close();
        
                Response.ClearContent();
                Response.ClearHeaders();
                Response.ContentType = "application/pdf";
                Response.AddHeader("Content-Disposition", "attachment; filename=" + DateTime.Now);
        
                Response.BinaryWrite(mem.ToArray());
                Response.End();
                Response.Flush();
                Response.Clear();
            }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-02-27
          • 1970-01-01
          • 1970-01-01
          • 2015-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多