我正在使用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文件中删除整个
DataSources
和DataSets
标记,但这会导致它崩溃并出现无效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();
}