在ReportViewer

时间:2016-05-27 09:13:53

标签: c# winforms datagridview reportviewer

在之前关于报表查看器中动态列的问题之后,我想我至少会尝试让事情正常运行。
显示的输出是数学因子列,每个都有自己的唯一名称。这些因素(可以选择1到10之间的任何数字)在我的DataGridView控件中显示没有问题 - 我通过根据需要添加行/列来生成DataTable,然后将数据表设置为DataGridView的数据源。 我已经将ReportViewer添加到我的WinForm中,并生成了一个RDLC文件。我的RDLC设置有10列(我知道永远不会超过这个),而不是花费数小时试图弄清楚如何使其动态化,而DataSet被分配给我的ReportViewer控件。然后,我使用以下代码将数据分配给查看器:

DataTable dt = new DataTable();
var source = this.dgvSelectedElements.DataSource;
while (source is BindingSource)
{
    source = ((BindingSource)source).DataSource;
}
var table = source as DataTable;
if (table != null)
{
    dt = table;
    var reportSource = new ReportDataSource("FactorReport", dt);
    this.reportViewer1.Reset();
    this.reportViewer1.ProcessingMode = ProcessingMode.Local;            
    this.reportViewer1.LocalReport.ReportPath = "FactorReport.rdlc";
    this.reportViewer1.LocalReport.DataSources.Clear();
    this.reportViewer1.LocalReport.DataSources.Add(reportSource);
    this.reportViewer1.RefreshReport();
}

这就是DataGridview的外观:
enter image description here 然后,这是Reportviewer - 注意两个' Rate'和' Mult'行显示在底部 enter image description here enter image description here
因此,虽然看起来有效,但我看不到网格中的值。此外,当年龄超过100岁时,年龄排序不正确 - 可以关闭排序吗?并且假设我可以使用它,是否可以迭代ReportViewer并修改列标题?一个快速谷歌告诉我不是在运行时间?

2 个答案:

答案 0 :(得分:1)

您应该在DataTable中将列表名称设置为DataSource DataGridView的{​​{1}}。它们应为AgeFactor1Factor2,...,Factor10

您使用这些列名创建了报告。因此,当您为网格动态创建DataTable时,应将列名设置为与创建报告时使用的名称相同。

如何使用相同的列名?

但是,您只需创建一个包含Age,Factor1,...,Factor10的临时DataTable来填充原始数据表即可解决问题。将此表传递给报告,它将起作用。

如何在DataGridView中显示相同的列标题?

解决方案是列标题作为参数。在报表设计器中创建10个参数,并使用参数在报表中设置tablix的列标题,但不要更改列的名称。那些应该是AgeFactor1,....然后当你想要显示报告时,除了上面提到的临时表之外,还要使用参数传递列标题。

另一个想法

另外一个想法是,您可以使用包含所有可用列的完全相同的DataTable报告,然后当您想要在报告中显示某些列时,只需将一些参数传递给网格,这表示每列的可见性

答案 1 :(得分:1)

可能不是最好/最快的解决方案,但它可以工作,并且对可见性表达式进行了一些额外的更改,我只能显示已选择的列数。
我将名为 Factor_Name_1 的10个参数添加到 Factor_Name_10 ,并在创建属性时选中了“允许空值”。然后我编写了一些代码来添加参数的数据,存储现有的列名,然后将它们重命名为我的Factor1,Factor2 ... Factor10标题,如下所示(注意我并不担心第一个'Age'列):< / p>

        // loop through the columns to create parameters...
        for (int i = 1; i < dt.Columns.Count; i++)
        {
            // get the name of the column...
            string factorName = dt.Columns[i].ColumnName;
            // define the new column name...
            string colName = string.Format("Factor_Name_{0}", i);
            // change the column name now we have stored the real name...
            dt.Columns[i].ColumnName = string.Format("Factor{0}", i);
            // generate the parameter...
            var rparam = new ReportParameter(colName, factorName);
            // add it to the parameter set for the control...
            this.reportViewer1.LocalReport.SetParameters(new[] { rparam });
        }

通过在创建关联参数后重新设置列名,数据将正确绑定。在我的RDLC设计器中,我所要做的就是用相关的参数值替换现有的标题。然后,为了隐藏未选择的列,我将参数和行文本框的可见性表达式设置为:

=IIF(ISNOTHING(Parameters!Factor_Name_1.Value),True,False)
....
....
=IIF(ISNOTHING(Parameters!Factor_Name_10.Value),True,False)

现在,如果我选择1或10列,则查看器会显示正确的列数并隐藏不需要的列。我现在正在重复“年龄”列(已经重复标题)并在运行时添加页眉/页脚,但我目前有一个报告,以正确的标题显示我需要的数据。
current sonar-maven source
With four items selected 感谢@Reza Aghaei让我走上正轨。