以正确的方式加载 Microsoft Reports

Loading Microsoft Reports the proper way

我正在使用 Wpf 查看一些使用报表查看器的报表。我使用 sql 报表生成器设计了一个报表 'ReportByTopic.rdl' 将其添加到解决方案中 ..rdl 文件中的数据集名为 'Dataset1' 并且有三个参数 @TopicId ,@SDate, @EDate 测试了查询,它工作正常

我正在尝试将过滤后的数据加载到 ReportViewer 中,但未查看任何数据

这是代码

private void reportViewer_load()
{
    ReportParameter[] Params = new ReportParameters[3];
    Params[0] = new ReportParameter("TopicId", "4");
    Params[1] = new ReportParameter("SDate", "2009-01-01");
    Params[2] = new ReportParameter("EDate", "2017-01-01");

    ReportDataSource rds = new ReportDataSource();
    rds.Name = "DataSet1";

    reportViewer.LocalReport.ReportPath = "Reports\ReportByTopic.rdl";
  reportViewer.LocalReport.DataSource.Add(rds)
    reportViewer.LocalReport.SetParameters(Params);
    reportViewer.Refresh();
}

所以我哪里错了

更新

根据回答我对上面的代码做了一些修改。首先,我使用了一种方法 'GetData',其中 returns 是我需要的所有数据的数据表,使用与设计 rdl 文件时相同的查询。 编辑后的代码

    private void reportViewer_load()
{
    ReportParameter[] Params = new ReportParameters[3];
    Params[0] = new ReportParameter("TopicId", "4");
    Params[1] = new ReportParameter("SDate", "2009-01-01");
    Params[2] = new ReportParameter("EDate", "2017-01-01");

    ReportDataSource rds = new ReportDataSource("DataSet1", GetData());


    reportViewer.LocalReport.ReportPath = "Reports\ReportByTopic.rdl";
  reportViewer.LocalReport.DataSource.Add(rds)
    reportViewer.LocalReport.SetParameters(Params);
    reportViewer.Refresh();
}

数据表正确填充了 900 行,但 reportViewer 仍然没有

您在创建 ReportDataSource 时忽略了将数据传递给报表,将数据集名称和数据传递给其构造函数:

IEnumerable data = GetFromDataBase(...);
ReportDataSource rds = new ReportDataSource("DataSet1",data);

reportViewer.LocalReport.ReportPath = "Reports\ReportByTopic.rdl";
reportViewer.LocalReport.DataSource.Add(rds)

查看 ReportDataSource 构造函数了解更多详情。

UPDATE:

从你的更新中我发现了一个问题。你调用的是控件基class的Refresh方法,而你实际上想调用[=22] =]刷新报告。它们用于两种不同的事物。因此,您的最后四行需要替换为:

reportViewer.LocalReport.ReportPath = "Reports\ReportByTopic.rdl";
reportViewer.LocalReport.DataSources.Clear() //Added line
reportViewer.LocalReport.DataSource.Add(rds)
reportViewer.LocalReport.SetParameters(Params);
reportViewer.RefreshReport(); //Replaced line

请注意,我在设置数据源之前首先调用了 Clear 方法。当您想 reload/refresh 报告而不关闭它时,这很有用。