Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# UserControl将GridView导出为PDF_C#_Asp.net_Pdf_Gridview_Itextsharp - Fatal编程技术网

C# UserControl将GridView导出为PDF

C# UserControl将GridView导出为PDF,c#,asp.net,pdf,gridview,itextsharp,C#,Asp.net,Pdf,Gridview,Itextsharp,我有一个UserControl,我正在尝试将我的GridView表导出为PDF。我可以很好地处理CSV文件,但在处理PDF文件时会出错。(我正在使用iTextSharp库)这是我得到的错误: 必须将类型为“GridView”的控件“DoNotAddList\u 1\u GridView1”放置在带有runat=server的表单标记中。“ 我的html中有一个表单标记,我尝试将它添加到ascx文件中,但没有任何效果。我发现很多人都会遇到此错误,大多数人都建议将此代码添加到ascx.cs文件中:

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

必须将类型为“GridView”的控件“DoNotAddList\u 1\u 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();
}
}
使用系统;
使用系统数据;
使用系统配置;
使用系统集合;
使用System.Web;
使用System.Web.Security;
使用System.Web.UI;
使用System.Web.UI.WebControl;
使用System.Web.UI.WebControl.WebParts;
使用System.Web.UI.HTMLControl;
使用System.IO;
使用iTextSharp.text;
使用iTextSharp.text.pdf;
使用iTextSharp.text.html;
使用iTextSharp.text.html.simpleparser;
公共部分类UserControls\u DoNotAddListControl:System.Web.UI.UserControl
{
受保护的无效PDF\u单击(对象发送者,事件参数e)
{   
Response.ContentType=“application/pdf”;
Response.AddHeader(“内容处置”,
“附件;文件名=GridViewExport.pdf”);
Response.Cache.SetCacheability(HttpCacheability.NoCache);
StringWriter sw=新的StringWriter();
HtmlTextWriter hw=新的HtmlTextWriter(sw);
GridView1.AllowPaging=false;
GridView1.DataBind();
GridView1.渲染控制(hw);
StringReader sr=新的StringReader(sw.ToString());
文档pdfDoc=新文档(PageSize.A4、10f、10f、10f、0f);
HTMLWorker htmlparser=新的HTMLWorker(pdfDoc);
GetInstance(pdfDoc,Response.OutputStream);
pdfDoc.Open();
解析(sr);
pdfDoc.Close();
响应写入(pdfDoc);
Response.End();
}
受保护的无效CSV\u单击(对象发送者,事件参数e)
{
Response.ClearContent();
AddHeader(“内容处置”,string.Format(“附件;文件名={0}”,“BloombergDaily.csv”);
Response.ContentType=“应用程序/文本”;
GridView1.AllowPaging=false;
GridView1.DataBind();
StringBuilder strbldr=新的StringBuilder();
对于(int i=0;i
以下是我在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> 



我知道这可能来自左字段,但您是否将用户控件放置在带有runat=“server”属性的表单标记中

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

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

Hers的UserControl代码,该控件具有ExportPdf()方法

这是.ascx文件的源代码

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

}

尝试此操作。相应地替换控件类型

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

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


以下是我找到的解决方案:

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();
    }

我到底该把它放在哪里?我尝试在
中添加它,但它给了我一个编译错误。您必须将该方法放在.aspx文件的代码后面,而不是.aspx文件中。aspx.cs。如果不起作用,请告诉我。这看起来可能会起作用。我在使aspx和aspx.cs文件一起工作时遇到问题。我得到一个错误,说“Masterpages_MyWebForm类型的声明缺少部分修饰符;存在另一个此类型的部分声明”。我有
公共类母版页\u MyWebForm:System.Web.UI.Page{}
作为我的类。在我的aspx文件
中,您的类声明中可能缺少部分标识符。试试公共部分类母版页{u MyWebForm:System.Web.UI.Page{}好吧,我添加了
partial
,现在我得到了“CS1061:不包含'BtnPDF_Click'的定义,没有扩展方法…”我不确定我做错了什么。
 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 */
        }
    }
public override void VerifyRenderingInServerForm(Control control)
     {
         Macro grid = control as Macro ;
         if (grid != null && grid.ID == "Macro1")
             return;
         else
             base.VerifyRenderingInServerForm(control);

     }
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();
    }