我查看了问题的历史记录,点击谷歌和其他结果,但仍然对C#reportViewer感到困惑。它似乎只想使用“类型”数据集。正如许多其他人所询问的那样,我没有看到任何真正的答案,也许一个新的帖子会带来新的东西。
在最简单的形式中,我有一个从数据库执行查询的业务对象。我知道结果列是什么,并希望将其插入到我需要的“格式化”的特定报告中,而不是简单的柱状转储。
由于查询返回“DataTable”对象,但没有“已键入”的已知列,我已经被软管了。
正如其他帖子所述,如果我有200多个表,400多个视图和200多个存储过程的系统,我不想输入所有内容。特别是如果我正在执行一个新查询,该查询是从某些新存储过程加入的各个表的结果。
报告不应该这么困难。如果我输入的列错误,或者SUM(),COUNT()或其他错误,这是我的错,但至少让我在报告中得到一个无类型的表。
...帮助
答案 0 :(得分:3)
DataTable的列不需要输入,它们都可以使用默认的字符串。
我做的是将DataSet添加到项目中,并设计了DataSet以匹配我的查询。我将所有列都保留为字符串。在RDLC中,我使用此DataSet作为我的数据源设置了一个表,严格用于设计时间。
在运行时,我改为动态交换我生成的DataTable并确保它与设计时DataSet相匹配(因为它们都是字符串,我只需要确保我的DataTable具有相同的列数且列名匹配)。
DataTable dt = new DataTable();
DataColumn dc = dt.Columns.Add();
dc.ColumnName = "DataColumn1";
dc = dt.Columns.Add();
dc.ColumnName = "DataColumn2";
dt.Rows.Add(new object[] { "Frank", 32 });
this.reportViewer1.LocalReport.DataSources.Clear();
this.reportViewer1.LocalReport.DataSources.Add(new ReportDataSource("DataSet1_DataTable1", dt));
this.reportViewer1.RefreshReport();
在运行时,ReportViewer将此DataTable作为其数据源加载并使用它来填充表。
这就是你追求的目标吗?