7

我试图在不显示 Microsoft Report Viewer 的情况下直接打印 RDLC 文件,我遵循了MSDN 的示例,但现在,每次我调用 LocalReport 类实例的“Render”方法时,它都会抛出“一个或多个参数需要运行报告尚未指定。” 例外。

谁能告诉我我错过了哪个参数?或者我如何才能找到有关此异常的更多详细信息?

        LocalReport report = new LocalReport();
        report.ReportPath = System.Windows.Forms.Application.StartupPath + "\\" + rdlcFileName;
        report.EnableExternalImages = true;

        ReportParameter[] reportParams = new ReportParameter[]
        {
            new ReportParameter("LogoAddress", settings.LogoFileName),
            new ReportParameter("FooterValue", settings.InvoicesFooter)
        };
        report.SetParameters(reportParams);

        report.DataSources.Add(new ReportDataSource("Invoice", new PrintableInvoice[] { invoice }));
        report.DataSources.Add(new ReportDataSource("InvoiceItem", invoiceItems));

        Warning[] warnings;
        try
        {
            string deviceInfo =
                "<DeviceInfo>" +
                "  <OutputFormat>EMF</OutputFormat>" +
                "  <PageWidth>8.5in</PageWidth>" +
                "  <PageHeight>11in</PageHeight>" +
                "  <MarginTop>0.25in</MarginTop>" +
                "  <MarginLeft>0.25in</MarginLeft>" +
                "  <MarginRight>0.25in</MarginRight>" +
                "  <MarginBottom>0.25in</MarginBottom>" +
                "</DeviceInfo>";

            m_streams = new List<Stream>();
            report.Render("Image", deviceInfo, _CreateStream, out warnings);

            foreach( Stream stream in m_streams )
                stream.Position = 0;
        }
        catch( Exception ex )
        {
            System.Diagnostics.Debug.WriteLine(ex.Message);
        }

_CreateStream 是:

    private Stream _CreateStream(string name, string fileNameExtension, Encoding encoding, string mimeType, bool willSeek)
    {
        Stream stream = new FileStream(name + "." + fileNameExtension, FileMode.Create);
        m_streams.Add(stream);
        return stream;
    }
4

5 回答 5

15

我刚刚发现如果你将参数值作为空字符串传递,比如 parameter = "" 它会给你那个错误

花了我一段时间

于 2010-11-12T09:39:12.507 回答
7

在参数属性中允许 null 将解决此问题。

于 2014-02-14T19:41:14.457 回答
3

原因:本地报告不允许您传递空或空参数,我不知道为什么,但它会引发异常。

修复:找出导致异常的参数的一种方法是调用 var result = report.LocalReport.GetParameters(); 方法,在结果参数数组中它具有 result[0].State 属性,如果它是值 MissingValidValue 则导致异常。

例子:

 var rv = new ReportViewer { ProcessingMode = ProcessingMode.Local };
        rv.LocalReport.ReportPath = Server.MapPath("~/PrintForms/FromForm.rdlc");
        rv.LocalReport.Refresh();

        string mimeType;
        string encoding;
        string filenameExtension;
        string[] streamids;
        Warning[] warnings;

        rv.LocalReport.SetParameters(new ReportParameter("ClientName", "გიორგი გიორგაძე"));
        rv.LocalReport.SetParameters(new ReportParameter("Account", "888"));var streamBytes = rv.LocalReport.Render("PDF", null, out mimeType, out encoding, out filenameExtension, out streamids, out warnings);
        return File(streamBytes, mimeType);

上面的代码可以正常工作,但是如果您将参数添加行更改为:

rv.LocalReport.SetParameters(new ReportParameter("Account", null));

Account ReportParameter 的 State 值将是 MissingValidValue 并且会导致 Exception 。

于 2015-12-04T10:56:28.847 回答
1

如果您确实需要将空白字符串作为值传递,则可以执行以下操作:

  • 打开参数属性(右键单击报告数据面板上的参数);
  • 标记允许空白值 ("")复选框。

这为我解决了问题。

于 2016-04-14T17:25:57.250 回答
0

另一种可能发生这种情况的方式是,如果您使用的是共享数据集,并且您包含报表未使用的数据集。每个报告必须在本地为每个共享数据集定义自己的参数版本。因此,如果您已将数据集作为您的数据源之一,并且您没有明确定义此特定报告将如何将参数传递给该数据集,您将收到此错误。

于 2017-08-04T21:00:22.860 回答