我正在使用以下代码尝试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();
错误为:未指定报告定义的来源
答案 0 :(得分:5)
将ReportParameter放在
之后_reportViewer.LocalReport.ReportPath = "../../Report1.rdlc";
在这里编写ReportParameter
答案 1 :(得分:3)
我发现自己陷入了同样的错误,原因其实很简单:首先必须设置报表定义,之前参数。这样,LocalReport
可以检查它们是否真的是强制性的并最终抛出异常。
以下代码应该有效:
_reportViewer.LocalReport.DataSources.Add(reportDataSource1);
_reportViewer.LocalReport.ReportPath = "../../Report1.rdlc";
_reportViewer.ServerReport.SetParameters(report);
答案 2 :(得分:2)
错误与您的参数无关。该错误与ReportPath
有关。有关设置报告路径的信息,请参阅this other SO question。您确定应用程序运行时指定的相对路径是否正确。该路径是相对于您的源代码的吗?如果您想查看它在哪里查找文件,那么您可以添加一些代码来解析该相对路径(Path.GetFullPath)并查看其指向的位置。确保您的rdlc
文件位于该文件夹中。
修改强>
根据您更新的问题并验证是否确实找到了报告。我在你的代码中查看了更多细节。您正在设置ServerReport
的参数,但是您要在LocalReport
中加载报告。尝试在LocalReport
中设置参数。
_reportViewer.LocalReport.SetParameters(report);
答案 3 :(得分:1)
我今天遇到了同样的问题,在我的情况下,原因是#34; copy-paste"问题。 在下面的代码中用LocalReport替换ServerReport解决了这个问题。变化
_reportViewer.LocalReport.DataSources.Add(reportDataSource1);
到
_reportViewer.ServerReport.SetParameters(report);
答案 4 :(得分:1)
你应该改变:
_reportViewer.ServerReport.SetParameters(report); //error
要:
_reportViewer.LocalReport.SetParameters(report);
答案 5 :(得分:0)
您的报告可能是嵌入式资源,因此当您尝试使用_reportViewer.ServerReport.SetParameters(report);//error
设置参数时,尚未加载报告定义。
因此,如果您的报告是嵌入式资源,则需要在设置报告参数之前致电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);
}
}
希望这可以帮助其他人解决这个类似的错误。