C# 呈现用户控件并调用其页面加载
以下代码将不起作用,因为控件(page1、page2、page3)要求调用其“Page_Load”事件C# 呈现用户控件并调用其页面加载,c#,.net,pdf-generation,C#,.net,Pdf Generation,以下代码将不起作用,因为控件(page1、page2、page3)要求调用其“Page_Load”事件 using System; using System.IO; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; using iTextSharp.text; using iTextSharp.text.html.simpleparser; using iTextSharp.text.pdf; pub
using System;
using System.IO;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using iTextSharp.text;
using iTextSharp.text.html.simpleparser;
using iTextSharp.text.pdf;
public partial class utilities_getPDF : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
// add user controls to the page
AddContentControl("controls/page1");
AddContentControl("controls/page2");
AddContentControl("controls/page3");
// set up the response to download the rendered PDF...
Response.ContentType = "application/pdf";
Response.ContentEncoding = System.Text.Encoding.UTF8;
Response.AddHeader("Content-Disposition", "attachment;filename=FileName.pdf");
Response.Cache.SetCacheability(HttpCacheability.NoCache);
// get the rendered HTML of the page
System.IO.StringWriter stringWrite = new StringWriter();
System.Web.UI.HtmlTextWriter htmlWrite = new HtmlTextWriter(stringWrite);
this.Render(htmlWrite);
StringReader reader = new StringReader(stringWrite.ToString());
// write the PDF to the OutputStream...
Document doc = new Document(PageSize.A4);
HTMLWorker parser = new HTMLWorker(doc);
PdfWriter.GetInstance(doc, Response.OutputStream);
doc.Open();
parser.Parse(reader);
doc.Close();
}
// the parts are probably irrelevant to the question...
private const string contentPage = "~/includes/{0}.ascx";
private void AddContentControl(string page)
{
content.Controls.Add(myLoadControl(page));
}
private Control myLoadControl(string page)
{
return TemplateControl.LoadControl(string.Format(contentPage, page));
}
}
所以我的问题是:
如何获取控件HTML?首先,要使动态添加的控件参与页面生命周期,需要在page PreInit事件中创建它们。看 然后,为了获得完整的HTML,确保处理了所有页面事件,您可以按如下方式重写页面呈现方法:
using System;
using System.IO;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using iTextSharp.text;
using iTextSharp.text.html.simpleparser;
using iTextSharp.text.pdf;
public partial class utilities_getPDF : System.Web.UI.Page
{
protected void Page_PreInit(object sender, EventArgs e)
{
// add user controls to the page
AddContentControl("controls/page1");
AddContentControl("controls/page2");
AddContentControl("controls/page3");
}
// the parts are probably irrelevant to the question...
private const string contentPage = "~/includes/{0}.ascx";
private void AddContentControl(string page)
{
content.Controls.Add(myLoadControl(page));
}
private Control myLoadControl(string page)
{
return TemplateControl.LoadControl(string.Format(contentPage, page));
}
protected override void Render(HtmlTextWriter writer)
{
//ignore asp.net writer and use your own.
//base.Render(writer);
// set up the response to download the rendered PDF...
Response.ContentType = "application/pdf";
Response.ContentEncoding = System.Text.Encoding.UTF8;
Response.AddHeader("Content-Disposition", "attachment;filename=FileName.pdf");
Response.Cache.SetCacheability(HttpCacheability.NoCache);
// get the rendered HTML of the page
System.IO.StringWriter stringWrite = new StringWriter();
System.Web.UI.HtmlTextWriter htmlWrite = new HtmlTextWriter(stringWrite);
base.Render(htmlWrite);
htmlWrite.Flush();
htmlWrite.Close();
StringReader reader = new StringReader(stringWrite.ToString());
System.IO.MemoryStream stream = new MemoryStream();
// write the PDF to the OutputStream...
Document doc = new Document(PageSize.A4);
HTMLWorker parser = new HTMLWorker(doc);
PdfWriter.GetInstance(doc, stream);
doc.Open();
parser.Parse(reader);
doc.Close();
//binary write your pdf file
Response.Clear();
Response.BinaryWrite(stream.GetBuffer());
Response.End();
}
}
首先,为了让动态添加的控件参与页面生命周期,您需要在page PreInit事件中创建它们。看 然后,为了获得完整的HTML,确保处理了所有页面事件,您可以按如下方式重写页面呈现方法:
using System;
using System.IO;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using iTextSharp.text;
using iTextSharp.text.html.simpleparser;
using iTextSharp.text.pdf;
public partial class utilities_getPDF : System.Web.UI.Page
{
protected void Page_PreInit(object sender, EventArgs e)
{
// add user controls to the page
AddContentControl("controls/page1");
AddContentControl("controls/page2");
AddContentControl("controls/page3");
}
// the parts are probably irrelevant to the question...
private const string contentPage = "~/includes/{0}.ascx";
private void AddContentControl(string page)
{
content.Controls.Add(myLoadControl(page));
}
private Control myLoadControl(string page)
{
return TemplateControl.LoadControl(string.Format(contentPage, page));
}
protected override void Render(HtmlTextWriter writer)
{
//ignore asp.net writer and use your own.
//base.Render(writer);
// set up the response to download the rendered PDF...
Response.ContentType = "application/pdf";
Response.ContentEncoding = System.Text.Encoding.UTF8;
Response.AddHeader("Content-Disposition", "attachment;filename=FileName.pdf");
Response.Cache.SetCacheability(HttpCacheability.NoCache);
// get the rendered HTML of the page
System.IO.StringWriter stringWrite = new StringWriter();
System.Web.UI.HtmlTextWriter htmlWrite = new HtmlTextWriter(stringWrite);
base.Render(htmlWrite);
htmlWrite.Flush();
htmlWrite.Close();
StringReader reader = new StringReader(stringWrite.ToString());
System.IO.MemoryStream stream = new MemoryStream();
// write the PDF to the OutputStream...
Document doc = new Document(PageSize.A4);
HTMLWorker parser = new HTMLWorker(doc);
PdfWriter.GetInstance(doc, stream);
doc.Open();
parser.Parse(reader);
doc.Close();
//binary write your pdf file
Response.Clear();
Response.BinaryWrite(stream.GetBuffer());
Response.End();
}
}