【问题标题】:Loading Microsoft Reports the proper way以正确的方式加载 Microsoft Reports
【发布时间】:2017-02-22 23:06:46
【问题描述】:

我正在使用 Wpf 使用 Report Viewer 查看一些报告。我使用 sql 报告生成器“ReportByTopic.rdl”设计了一个报告,将其添加到了解决方案中。rdl 文件中的 DataSet 名为“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”,它使用与设计 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 仍然没有

【问题讨论】:

  • 根据您更新的代码查看答案的更新。

标签: c# wpf reportviewer reportbuilder3.0


【解决方案1】:

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

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

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

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

更新:

从您的更新中我发现了一个问题。当您实际想要调用 RefreshReport 时,您正在调用控件基类的 Refresh 方法。它们用于两种不同的事情。所以你的最后四行需要替换为:

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 方法。当您想要重新加载/刷新报告而不关闭它时,这很有用。

【讨论】:

  • 我在 rdl 文件的数据集中指定了查询.. 它不是使用该查询自动获取数据吗?
  • 您只指定了报表的架构,但需要明确提供实际数据。
  • 好的,谢谢您的回答.. 但我希望能得到更多帮助.. 如果从具有多种类型的各种表中检索数据并且无法在集合中.. 什么是正确的对象我把这些数据放在
  • 因为我检索了数据表中的数据,但还是不行
  • 最简单的方法是创建一个存储过程来输出想要的数据。然后在代码中调用存储过程并将结果存储在数据表或您选择的另一个集合中。看看stackoverflow.com/questions/1933855/…blogs.msmvps.com/deborahk/…
猜你喜欢
  • 2019-03-14
  • 2020-03-31
  • 1970-01-01
  • 1970-01-01
  • 2011-10-05
  • 1970-01-01
  • 1970-01-01
  • 2012-03-27
  • 2014-01-19
相关资源
最近更新 更多