以正确的方式加载 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 报告而不关闭它时,这很有用。
我正在使用 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 报告而不关闭它时,这很有用。