动态定义 SSRS 报表的 DataSet 和 DataSource

3

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

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

根据这篇MSDN文章的指示,我创建了一个包含嵌入式数据源和数据集的报表。但是,现在应用程序需要一个ComboBox来展示报表名称,以便用户选择在ReportViewer控件中显示哪个报表。
我的计划如下:
1. 有一堆RDLC报表文件,每个文件都带有适当的列名和布局信息。 2. 能够在代码中切换数据集,通过Entity Framework调用不同的存储过程。
我已经尝试手动从RDLC文件中删除整个DataSourcesDataSets标记,但这会导致它崩溃并出现无效XML错误。
是否可能有一个没有嵌入在XML中的数据集/数据源的报表?然后,RDLC XML将提供布局,数据将来自代码后台?
下面是我在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个回答

1
我认为更好的方法是让报告根据您传递的参数值决定运行哪个存储过程。让报告做报告应该做的事情,获取和显示数据。代码处理后面的报告运行和时间。
你描述的方法似乎是让报告变得非常复杂的好方法。为了您自己和在您之后管理报告的人的利益,请保持简单。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接