ReportViewer渲染不重置新数据

时间:2014-11-04 03:51:29

标签: c# .net reportviewer

我有一种方法可以将报告呈现为PDF,以便可以将其附加到电子邮件中。代码如下:

private string generate_pdf_report(int ponum)
    {
        this.DataTable1TableAdapter.Fill(this.reportdataset.DataTable1, ponum);

        Warning[] warnings;
        string[] streamids;
        string mimeType;
        string encoding;
        string filenameExtension;
        string filename = "Purchase Requisition " + ponum.ToString() + ".pdf";

        byte[] bytes = reportViewer1.LocalReport.Render(
            "PDF", null, out mimeType, out encoding, out filenameExtension,
            out streamids, out warnings);
        try
        {
            using (FileStream fs = new FileStream(filename, FileMode.Create))
            {
                fs.Write(bytes, 0, bytes.Length);
            }
        }
        catch(Exception ex)
        {
            throw ex;
        }

        return filename;
    }

第一次运行正常,但如果用户生成另一个报告并发送电子邮件,则附加到电子邮件的报告是生成的第一个报告,而不是当前生成的报告。

例如,用户打开软件,创建采购订单#3,并生成PDF并通过电子邮件正确发送。然后,用户在不退出软件的情况下创建新的采购订单#4。提交#4后,附在电子邮件上的PDF来自#3,就像ReportViewer没有清除以前的数据一样。

即使使用ReportViewer界面生成新报告,也不会影响附加到电子邮件的内容。我尝试在渲染之间清除ReportViewer无效。

我在这里缺少什么?

1 个答案:

答案 0 :(得分:0)

我能够通过重置函数的每次迭代重置ReportDataSource来解决问题:

        this.DataTable1TableAdapter.Fill(this.reportdataset.DataTable1, ponum);
        DataTable dt = new DataTable();
        dt = DataTable1TableAdapter.GetData(ponum);
        Microsoft.Reporting.WinForms.ReportDataSource rprtDTSource = new Microsoft.Reporting.WinForms.ReportDataSource(dt.TableName, dt);


        reportViewer1.LocalReport.DataSources.Add(rprtDTSource);

        Warning[] warnings;
        string[] streamids;
        string mimeType;
        string encoding;
        string filenameExtension;
        string filename = "Purchase Requisition " + ponum.ToString() + ".pdf";

        byte[] bytes = reportViewer1.LocalReport.Render(
            "PDF", null, out mimeType, out encoding, out filenameExtension,
            out streamids, out warnings);
        try
        {
            using (FileStream fs = new FileStream(filename, FileMode.Create))
            {
                fs.Write(bytes, 0, bytes.Length);
                fs.Flush();               
            }

        }
        catch (Exception ex)
        {
            throw ex;
        }

        return filename;