Winforms应用程序中ReportViewer的筛选器
本文关键字:筛选 ReportViewer 应用程序 Winforms | 更新日期: 2023-09-27 18:21:49
我有一个视图,它会返回SQL Server 2012数据库中的数据视图。视图中的一个字段是"SprintId"。
我有一个使用VS2012的C#WinForms应用程序,它有一个窗体,该窗体上有一个reportViewer。
当我运行它时,我会得到我期望的数据。
现在,我需要将SprintId列筛选为某个值。(因此,添加一个WHERE SprintId = 37'
)
我认为,在rdlc文件中添加Parameter是正确的做法。
因此,我添加了一个参数,称之为"SprintId",将"Type"设置为Integer,甚至设置了一个默认值37。
不过,我不确定在哪里将此参数指定为where子句。我有参数,但没有使用它。我在哪里将该参数分配给视图?
此外,我需要从表单中设置参数。因此,我添加了以下代码:
ReportParameterCollection reportParameters = new ReportParameterCollection();
reportParameters.Add(new ReportParameter("SprintId", "37"));
this.reportViewer1.LocalReport.SetParameters(reportParameters);
然后默认代码在之后立即启动
this.vwSprintDailyBreakdownTableAdapter.Fill(this.Scrum_MasterDataSet.vwSprintDailyBreakdown);
this.reportViewer1.RefreshReport();
然而,一旦我添加了参数代码,我的报告就完全是空白的。我做错了什么?
编辑:
我试过Romano的代码,这就是我现在使用的代码,但当我运行它时,我会得到一个完全空白的报告。
var result = new DataTable();
DataRow[] res = this.Scrum_MasterDataSet.vwSprintDailyBreakdown.Select("SprintId = 37");
foreach (DataRow row in res)
{
result.ImportRow(row);
}
this.vwSprintDailyBreakdownTableAdapter.Fill((Scrum_MasterDataSet.vwSprintDailyBreakdownDataTable)result);
this.reportViewer1.RefreshReport();
并捕获以下异常:{"无法将"System.Data.DataTable"类型的对象强制转换为"vwSprintDailyBreakdownDataTable"类型。"}
您可以创建第二个DataTable
,并使用原始表的Select
命令来"过滤"您的数据:
vwSprintDailyBreakdownDataTable result = new vwSprintDailyBreakdownDataTable();
DataRow[] res = this.Scrum_MasterDataSet.vwSprintDailyBreakdown.Select("SprintId = 37");
foreach (DataRow row in res)
{
result.ImportRow(row);
}
this.vwSprintDailyBreakdownTableAdapter.Fill(result);
this.reportViewer1.RefreshReport();
从数据库中检索数据时,应该考虑过滤数据。
在您的表适配器后面有一条SQL语句,当您调用Fill
时会执行该语句。通过右键单击现在包含Fill
方法的部分,可以添加用于选择数据的其他方法,例如名为FillFiltered
的方法。此方法应采用一个参数,select语句应考虑此参数。
然后,您不需要调用Fill
,而需要调用FillFiltered(37)
,并且只从数据库中检索所需的信息。