我使用下面的代码试图SetParametr:
var report = new ReportParameter[1];
report[0] = new ReportParameter("MyName", "Raha");
var reportDataSource1 = new ReportDataSource { Name = "WpfApplication17_User", Value = _users };
_reportViewer.LocalReport.DataSources.Add(reportDataSource1);
_reportViewer.ServerReport.SetParameters(report);
_reportViewer.LocalReport.ReportPath = "../../Report1.rdlc";
_reportViewer.RefreshReport();
错误:报表定义的来源尚未指定
为什么错了?
我创建了一个报表参数,参数名称是“MYNAME”
更新:
我使用下面的代码:
//var report = new ReportParameter[1];
//report[0] = new ReportParameter("MyName", "Raha");
var reportDataSource1 = new ReportDataSource { Name = "WpfApplication17_User", Value = _users };
string exeFolder = System.IO.Path.GetDirectoryName(Process.GetCurrentProcess().MainModule.FileName);
_reportViewer.LocalReport.ReportPath =exeFolder + @"\Reports\Report1.rdlc";
_reportViewer.LocalReport.DataSources.Add(reportDataSource1);
//_reportViewer.ServerReport.SetParameters(report);
_reportViewer.RefreshReport();
在报告中显示的数据。
但是,我使用下面的代码:
var report = new ReportParameter[1];
report[0] = new ReportParameter("MyName", "Raha");
var reportDataSource1 = new ReportDataSource { Name = "WpfApplication17_User", Value = _users };
string exeFolder = System.IO.Path.GetDirectoryName(Process.GetCurrentProcess().MainModule.FileName);
_reportViewer.LocalReport.ReportPath = exeFolder + @"\Reports\Report1.rdlc";
_reportViewer.LocalReport.DataSources.Add(reportDataSource1);
_reportViewer.ServerReport.SetParameters(report);//error
_reportViewer.RefreshReport();
错误为:报告定义的来源尚未指定
把ReportParameter后
_reportViewer.LocalReport.ReportPath = "../../Report1.rdlc";
在这里,你写你的ReportParameter
我发现自己坚持了同样的错误,实际上原因很简单:报表定义,必须在第一时间进行设置,参数前 。 这样, LocalReport
可以检查自己是否真的强制性,并最终抛出异常。
下面的代码应工作:
_reportViewer.LocalReport.DataSources.Add(reportDataSource1);
_reportViewer.LocalReport.ReportPath = "../../Report1.rdlc";
_reportViewer.ServerReport.SetParameters(report);
该错误不相关的参数。 该错误是关系到ReportPath
。 见这等SO问题对于设置报告路径。 你确定你的应用程序运行时您所指定的相对路径是正确的。 相对于你的源代码,这条道路? 如果你想看看它是要找的文件,那么你可以添加一些代码来解决相对路径( Path.GetFullPath ),看看它指向。 确保你的rdlc
文件是文件夹中。
编辑:
基于更新的问题,并确定该报告实际上是被人发现。 我看着更详细你的代码。 您的设置参数ServerReport
,但要加载的报告LocalReport
。 试图设置的参数LocalReport
。
_reportViewer.LocalReport.SetParameters(report);
今天我有同样的问题,在我的情况的原因“复制 - 粘贴”的问题。 只是LocalReport更换ServerReport在下面的代码解决了这个问题。 更改
_reportViewer.LocalReport.DataSources.Add(reportDataSource1);
至
_reportViewer.ServerReport.SetParameters(report);
你应该从改变:
_reportViewer.ServerReport.SetParameters(report); //error
至:
_reportViewer.LocalReport.SetParameters(report);
这可能是您的报告是一个嵌入的资源,因此,当您尝试设置一个参数_reportViewer.ServerReport.SetParameters(report);//error
报告定义尚未加载。
因此,如果您的报告是一个嵌入的资源,那么你需要调用report.LoadReportDefinition(stream); // Get report definition
report.LoadReportDefinition(stream); // Get report definition
设置报表参数之前。
即:以下从LocalReport返回一个PDF字节数组
public byte[] ProcessReportToPDFBytes(List<ReportDataSource> rds, Stream stream, string fileName, string outputType, SqlParameter[] rptParameters)
{
// Variables
Warning[] warnings;
string[] streamIds;
string mimeType = string.Empty;
string encoding = string.Empty;
string extension = string.Empty;
using (LocalReport report = new LocalReport())
{
// Setup the report viewer object and get the array of bytes
report.EnableHyperlinks = true;
report.EnableExternalImages = true;
report.SetBasePermissionsForSandboxAppDomain(new System.Security.PermissionSet(System.Security.Permissions.PermissionState.Unrestricted));
report.LoadReportDefinition(stream); // Get report definition
// **** Set the Report Parameters AFTER the LoadReportDefinition ****
if (rptParameters != null)
{
foreach (SqlParameter param in rptParameters)
{
report.SetParameters(new ReportParameter(param.ParameterName, param.Value == null ? "" : param.Value.ToString(), false));
}
}
foreach (ReportDataSource rds1 in rds)
{
report.DataSources.Add(rds1); // Add datasource here
}
// Render the PDF from the local report
return report.Render("PDF", null, out mimeType, out encoding, out extension, out streamIds, out warnings);
}
}
希望这可以帮助别人与此类似的错误。