动态定义SSRS报表数据集和数据源

本文关键字:数据源 数据集 报表 定义 SSRS 动态 | 更新日期: 2023-09-27 17:52:56

我正在使用Visual Studio 2015和Entity Framework 6构建MVVM Light WPF应用程序。它需要一些SSRS 本地报告在使用WindowsFormsHost控件的Reports.xaml视图(用户控件)中运行:

<WindowsFormsHost x:Name="WindowsFormsHost">
    <rv:ReportViewer x:Name="ReportViewer" />
</WindowsFormsHost>

按照这篇MSDN文章中的说明,我创建了一个具有嵌入式数据源和数据集的报表。但是,现在应用程序需要有一个ComboBox的报告名称,让用户选择在ReportViewer控件中显示哪个报告。

我想这样做:

  1. 有一堆RDLC报告文件,每个都有适当的列名和布局信息
  2. 能够在代码中切换数据集,通过实体框架调用不同的存储过程

我已经尝试手动从RDLC文件中删除整个DataSourcesDataSets标签,但这会使它崩溃,Visual Studio返回无效的XML错误。

有没有可能有一个报告没有数据集/数据源嵌入在XML?然后RDLC XML将提供布局,数据将来自代码隐藏?

以下是我在MSDN文章中尝试的Reports.xaml.cs代码,但它使用嵌入式数据集和数据源:

public MainWindow()
{
    InitializeComponent();
    Messenger.Default.Register<string>(this, "RunReport", RunReport);
}
private void RunReport(string reportName)
{
    Microsoft.Reporting.WinForms.ReportDataSource reportDataSource1 = 
       new Microsoft.Reporting.WinForms.ReportDataSource();
    AdventureWorks2008R2DataSet dataset = new AdventureWorks2008R2DataSet();
    dataset.BeginInit();
    //Name of the report dataset in our .RDLC file
    reportDataSource1.Name = "DataSet1"; 
    reportDataSource1.Value = dataset.SalesOrderDetail;
    this._reportViewer.LocalReport.DataSources.Add(reportDataSource1);
    this._reportViewer.LocalReport.ReportEmbeddedResource = 
        "<VSProjectName>.Report1.rdlc";
    dataset.EndInit();
    //fill data into adventureWorksDataSet
    AdventureWorks2008R2DataSetTableAdapters.SalesOrderDetailTableAdapter salesOrderDetailTableAdapter = 
       new AdventureWorks2008R2DataSetTableAdapters.SalesOrderDetailTableAdapter();
    salesOrderDetailTableAdapter.ClearBeforeFill = true;
    salesOrderDetailTableAdapter.Fill(dataset.SalesOrderDetail);
    _reportViewer.RefreshReport();
}

动态定义SSRS报表数据集和数据源

我认为更好的方法是让报表根据您传递的参数值来决定运行哪个存储过程。让报表做报表应该做的事情,获取和显示数据。后面的代码处理运行什么报告以及何时运行。

你描述的方法闻起来像是一种使报告复杂化的好方法。为了你自己,也为了在你之后管理报告的人,保持简单。