Visual WebGUI Report - 导出到PDF

      在Visual WebGUI处理Report的导出问题,跟在WebForm中的做法真不一样,还真头疼了一阵。但是在Visual WebGUI的论坛里找到了解决方法。一样是用 HttpResponse 来解决,但是Visual WebGUI中需要有它自己的方法才行,不然,最后导出只是在页面上显示的一大堆乱码而已。

       这是论坛中介绍解决方法的链接:Visual WebGUI Forum

       下面来段摘抄(位于上面的链接的最后一个Post)吧,Open-mouthed。这个例子用的Visual Studio自带的Report控件rdlc,大家将就着看吧。Tongue out

        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
    }    
posted @ 2008-01-03 23:46  David  Views(696)  Comments(0Edit  收藏  举报
Freelance Jobs