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"类型。"}

Winforms应用程序中ReportViewer的筛选器

您可以创建第二个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),并且只从数据库中检索所需的信息。