在之前关于报表查看器中动态列的问题之后,我想我至少会尝试让事情正常运行。
显示的输出是数学因子列,每个都有自己的唯一名称。这些因素(可以选择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的外观:
然后,这是Reportviewer - 注意两个' Rate'和' Mult'行显示在底部
因此,虽然看起来有效,但我看不到网格中的值。此外,当年龄超过100岁时,年龄排序不正确 - 可以关闭排序吗?并且假设我可以使用它,是否可以迭代ReportViewer并修改列标题?一个快速谷歌告诉我不是在运行时间?
答案 0 :(得分:1)
您应该在DataTable
中将列表名称设置为DataSource
DataGridView
的{{1}}。它们应为Age
,Factor1
,Factor2
,...,Factor10
。
您使用这些列名创建了报告。因此,当您为网格动态创建DataTable
时,应将列名设置为与创建报告时使用的名称相同。
如何使用相同的列名?
但是,您只需创建一个包含Age,Factor1,...,Factor10的临时DataTable
来填充原始数据表即可解决问题。将此表传递给报告,它将起作用。
如何在DataGridView中显示相同的列标题?
解决方案是列标题作为参数。在报表设计器中创建10个参数,并使用参数在报表中设置tablix的列标题,但不要更改列的名称。那些应该是Age
,Factor1
,....然后当你想要显示报告时,除了上面提到的临时表之外,还要使用参数传递列标题。
另一个想法
另外一个想法是,您可以使用包含所有可用列的完全相同的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
感谢@Reza Aghaei让我走上正轨。