Visual WebGUI Report - 导出到PDF
在Visual WebGUI处理Report的导出问题,跟在WebForm中的做法真不一样,还真头疼了一阵。但是在Visual WebGUI的论坛里找到了解决方法。一样是用 HttpResponse 来解决,但是Visual WebGUI中需要有它自己的方法才行,不然,最后导出只是在页面上显示的一大堆乱码而已。
这是论坛中介绍解决方法的链接:Visual WebGUI Forum
下面来段摘抄(位于上面的链接的最后一个Post)吧,。这个例子用的Visual Studio自带的Report控件rdlc,大家将就着看吧。
The form which tries to open the pdf file must be a gizmox gateway control ("IGatewayControl") so it will handle the file writing response disconected from WebGUI's main response. In order to solve your problem, implement the Gizmox.WebGUI.Common.Interfaces.IGatewayControl interface as follow:
public class Form1 : Form, IGatewayControl { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { Link.Open(new GatewayReference(this, "open")); } #region IGatewayControl Members public IGatewayHandler GetGatewayHandler(IContext objContext, string strAction) { LocalReport local = new LocalReport(); local.ReportPath = Context.Server.MapPath("~/Report1.rdlc"); DataSet1 dataSet = new DataSet1(); DataSet1TableAdapters.Tabla1TableAdapter Adapter = new WebGUIApplication1.DataSet1TableAdapters.Tabla1TableAdapter(); Adapter.Fill(dataSet.Tabla1); ReportDataSource dataSource = new ReportDataSource("DataSet1_Tabla1", dataSet.Tabla1); local.DataSources.Add(dataSource); string reportType = "PDF"; string mimeType = "application/pdf"; string encoding; string fileNameExtension; //The DeviceInfo settings should be changed based on the reportType //http://msdn2.microsoft.com/en-us/library/ms155397.aspx string deviceInfo = "<DeviceInfo>" + " <OutputFormat>PDF</OutputFormat>" + " <PageWidth>8.5in</PageWidth>" + " <PageHeight>11in</PageHeight>" + " <MarginTop>0.5in</MarginTop>" + " <MarginLeft>1in</MarginLeft>" + " <MarginRight>1in</MarginRight>" + " <MarginBottom>0.5in</MarginBottom>" + "</DeviceInfo>"; Warning[] warnings; string[] streams; byte[] renderedBytes; //Render the report renderedBytes = local.Render(reportType, deviceInfo, out mimeType, out encoding, out fileNameExtension, out streams, out warnings); //Clear the response stream and write the bytes to the outputstream //Set content-disposition to "attachment" so that user is prompted to take an action //on the file (open or save) HttpResponse objResponse = this.Context.HttpContext.Response; objResponse.Clear(); objResponse.ClearHeaders(); objResponse.ContentType = mimeType; objResponse.AddHeader("content-disposition", "attachment; filename=foo." + fileNameExtension); objResponse.BinaryWrite(renderedBytes); objResponse.Flush(); objResponse.End(); return null; } #endregion }