动态定义SSRS报告的DataSet和DataSource

时间:2016-06-28 14:49:36

标签: c# wpf entity-framework mvvm reporting-services

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

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

按照this MSDN article中的说明,我创建了一个包含嵌入式数据源和数据集的报告。但是,现在应用需要有ComboBox个报告名称,以便用户选择要在ReportViewer控件中显示哪个报告。

这是我想做的事情:

  1. 拥有一堆RDLC报告文件,每个文件都有相应的列名和布局信息
  2. 能够在代码中切换数据集以通过Entity Framework
  3. 调用不同的存储过程

    我尝试从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();
    }
    

1 个答案:

答案 0 :(得分:1)

我认为更好的方法是让报告根据您传递的参数值决定要运行的存储过程。让报告执行报告要执行的操作,获取并显示数据。后面的代码处理要运行的报告以及何时运行。

你所描述的方法闻起来是一种使地狱报告复杂化的好方法。为了您的利益,以及必须在您之后管理报告的人,请保持简单。