2016-06-28 104 views
3

我使用Visual Studio 2015年和Entity Framework 6.它需要有使用WindowsFormsHost一些SSRS 当地报告Reports.xaml视图(用户控件)内运行构建MVVM光WPF应用程序控制:定义SSRS报告中的数据集和DataSource动态

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

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

这是我想要做什么:

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

我试图手动从RDLC文件中删除整个DataSourcesDataSets标签,但那个吹起来和Visual Studio回来了无效的XML错误。

是否有可能在XML中没有嵌入数据集/数据源的报告?那么RDLC XML将提供布局,数据将来自代码隐藏?

这里就是我试图在我的Reports.xaml.cs代码隐藏从MSDN文章,但它使用嵌入数据集和数据源:

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

我认为这一个更好的办法是让报告根据您传递的参数值决定要运行的存储过程。让报告完成报告的目的,获取并显示数据。后面的代码处理要运行的报告和时间。

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