从C#调用SSRS报告时,只有主报告显示数据子报告给出错误

我开发了一个SSRS报告,其中包含一个主报告和一个子报告。 我从C#调用此报告。 我只知道如何将主rdlc与数据集绑定。

我使用下面的代码

SqlDataAdapter dataAdapter = new SqlDataAdapter(sqlcomm); dataAdapter.Fill(dataset); this.reportViewer1.LocalReport.ReportPath = Application.StartupPath + "\\sale_dept.rdl"; this.reportViewer1.LocalReport.DataSources.Clear(); this.reportViewer1.LocalReport.DataSources.Add(new Microsoft.Reporting.WinForms.ReportDataSource("DataSet1", dataset.Tables[0])); this.reportViewer1.RefreshReport(); 

当我运行exe我得到报告查看器填充主报告但3子报告显示错误,因为我没有为这些子报告指定DataSource

在此处输入图像描述

  1. 主报告和其他子报告之间没有参数传递
  2. main和all子报告的数据集名称默认为DataSet1

请指导我将子报告与适当的查询数据集表绑定。 我完全被困在这里。

编辑

我用1个子报告更改了我的项目。

在SSRS中它在(BIDS)编辑器中正常工作,但是当从C#调用时它给出了错误:

无法在指定位置找到。 请validation子报表是否已发布且名称是否正确。

我的代码:

 subreportevenhandler according to this question 

子报表事件处理程序的问题

  SqlDataAdapter dataAdapter = new SqlDataAdapter(sqlcomm); dataAdapter.Fill(dataset); this.reportViewer1.LocalReport.ReportPath = Application.StartupPath + "\\sale_dept.rdl"; this.reportViewer1.LocalReport.DataSources.Clear(); this.reportViewer1.LocalReport.SubreportProcessing += new SubreportProcessingEventHandler(addsubreport); this.reportViewer1.LocalReport.DataSources.Add(new Microsoft.Reporting.WinForms.ReportDataSource("DataSet1", dataset.Tables[0])); this.reportViewer1.RefreshReport(); void addsubreport(object sender, SubreportProcessingEventArgs e) { SqlConnection conn = new SqlConnection(source); DataSet dataset = new DataSet(); conn.Open(); SqlCommand sqlcomm = new SqlCommand( "Query for subreport", conn); SqlDataAdapter dataAdapter = new SqlDataAdapter(sqlcomm); dataAdapter.Fill(dataset); e.DataSources.Add(new ReportDataSource("DataSet1", dataset.Tables[0])); } 

我仍然收到子报告错误我将所有.rdl文件移动到C#bin文件夹..

在此处输入图像描述

主报告正确显示数据。 在SSRS中罚款..

我发现了这个问题。 我发布它作为答案,因为它可能在将来帮助某人。

SubreportProcessingEventHandler只会被触发.rdlc子报告。 在我的项目主报告中,所有子报告都是.rdl扩展名。 因此,只有我完成的更改才转到命令提示符并将子报表扩展名重命名为.rdlc

例如: – ren discount.rdl discount.rdlc

然后相应地附加子报告的数据集。

请参阅以下代码

 SqlDataAdapter dataAdapter = new SqlDataAdapter(sqlcomm); dataAdapter.Fill(dataset); this.reportViewer1.LocalReport.ReportPath = Application.StartupPath + "\\main_rpt.rdl"; this.reportViewer1.LocalReport.DataSources.Clear(); this.reportViewer1.LocalReport.SubreportProcessing += new SubreportProcessingEventHandler(addsubreport); this.reportViewer1.LocalReport.DataSources.Add(new Microsoft.Reporting.WinForms.ReportDataSource("DataSet1", dataset.Tables[0])); this.reportViewer1.RefreshReport(); void addsubreport(object sender, SubreportProcessingEventArgs e) { SqlCommand sqlcomm = new SqlCommand(); SqlDataAdapter dataAdapter = new SqlDataAdapter(); DataSet dataset = new DataSet(); Switch(e.ReportPath) { case "subreport1": sqlcomm = new SqlCommand( "Query for subreport one", conn); dataAdapter = new SqlDataAdapter(sqlcomm); dataAdapter.Fill(dataset); e.DataSources.Add(new ReportDataSource("DataSet for subreport1", dataset.Tables[0])); break; case "subreport2": sqlcomm = new SqlCommand( "Query for subreport two", conn); dataAdapter = new SqlDataAdapter(sqlcomm); dataAdapter.Fill(dataset); e.DataSources.Add(new ReportDataSource("DataSet for subreport2", dataset.Tables[0])); break; case "subreport3": sqlcomm = new SqlCommand( "Query for subreport three", conn); dataAdapter = new SqlDataAdapter(sqlcomm); dataAdapter.Fill(dataset); e.DataSources.Add(new ReportDataSource("DataSet for subreport3", dataset.Tables[0])); break; } } 

如果您有多个子报告,则需要切换。 要点注意的要点

  1. 所有子报告都应该有扩展名.rdlc

2.如果任何参数正在通过,请确保它也正确命名。

  1. 正确指定路径。 最好将主报表和子报表放在同一个文件夹中。

现在运行C#应用程序,它将显示包含所有子报告的主报告