【问题标题】:Display DataSource from DataGridView in ReportViewer在 ReportViewer 中显示来自 DataGridView 的数据源
【发布时间】:2016-05-27 09:13:52
【问题描述】:

继之前关于报表查看器中的动态列的问题之后,我想我至少会尝试让事情正常运行。
显示的输出是数学因子列,每个都有自己唯一的名称。这些因素(可以选择从 1 到 10 的任何数字)在我的 DataGridView 控件中显示没有问题 - 我通过根据需要添加行/列来生成 DataTable,然后将数据表设置为 DataGridView 的数据源。
我在我的 WinForm 中添加了一个 ReportViewer,并生成了一个 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 的外观:
然后,这是 Reportviewer - 注意底部的两个“Rate”和“Mult”行
因此,虽然它似乎有效,但我看不到网格中的值。另外,当年龄超过100时,年龄排序不正确-可以关闭排序吗?假设我可以让它工作,是否可以遍历 ReportViewer 并修改列标题?快速谷歌告诉我不是在运行时?

【问题讨论】:

标签: c# winforms datagridview reportviewer


【解决方案1】:

您应该在DataTable 中正确设置您动态创建为DataSourceDataGridView 的列名称。它们应该是AgeFactor1Factor2、...、Factor10

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

我怎样才能拥有相同的列名?

但是您可以简单地通过创建一个临时的DataTable 来解决这个问题,该DataTable 包含由原始数据表填充的Age、Factor1、...、Factor10。将此表传递给报告,它将起作用。

我怎样才能在 DataGridView 中显示相同的列标题?

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

另一个想法

作为另一个想法,您可以使用完全相同的DataTable 来生成报告,其中包含所有可用列,然后当您想在报告中显示某些列时,只需将一些参数传递给网格,以指示每列的可见性。

【讨论】:

  • 好的,这是有道理的 - 它无法匹配名称,因此不会绑定数据。我遇到的问题是,在用户选择它们之前我不知道列名。我设置了reportviewer 来测试我是否可以让它工作,希望我可以操纵RV 标题,但除非我将标题更改为factor1 等,否则它将无法工作。感谢您的答复。回到绘图板!
  • 是的,列名是问题所在。但是您可以简单地通过创建一个临时的DataTable 来修复它们,其中包含由原始数据表填充的AgeFactor1、...、Factor10。将此表传递给报告,它将起作用。
  • 谢谢,但我需要报告有实际的标题,在第一张图片中看到的那些(对于这个例子)我在我的查看器中设置标题只是为了看看我是否可以让数据工作.现在我明白问题出在哪里了,我需要找到不同的方法。
  • 解决方案是将它们作为参数传递。在报表设计器中创建 10 个参数,使用参数设置列的标题,但名称不更改列的名称。这些应该是AgeFactor1,...。然后,当您想要显示报告时,除了我在之前评论中提到的临时表之外,还可以使用参数传递列标题。问题将通过这种方式解决:)
  • 好的,谢谢 - 我得看看这个,因为 ReportViewer 对我来说是全新的,所以需要试着理解你的建议。
【解决方案2】:

也许不是最好/最快的解决方案,但它可以工作,并且对可见性表达式进行了一些额外的更改,我只能显示已选择的列数。
我在我的报表查看器中添加了 10 个参数,名为 Factor_Name_1Factor_Name_10,并在创建它们时选中了属性中的“允许空值”。然后我编写了一些代码来为参数添加数据,在将现有列名重命名为我的 Factor1、Factor2...Factor10 标题之前存储现有的列名,如下所示(注意我并不担心第一个“年龄”列): /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 列,查看器会显示正确的列数并隐藏不需要的列。我现在正在重复“年龄”列(已经有重复的标题)并在运行时添加页眉/页脚,但我目前有一个报告显示我需要的具有正确标题的数据。
感谢@Reza Aghaei 让我走上正轨。

【讨论】:

  • “=IIF(ISNOTHING(Parameters!Factor_Name_10.Value),True,False)”究竟是什么意思。
  • @code frenzy - 这适用于 Visibility 属性,因此当没有数据时该列被隐藏。这有帮助吗?
  • 哦,很好的逻辑。让我在我的项目中尝试一下,看看它是否有帮助。非常感谢:)
猜你喜欢
  • 2015-09-27
  • 2017-08-03
  • 2023-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-08
  • 2015-04-25
相关资源
最近更新 更多