【问题标题】:C# ReportViewer with UnTyped datatable sources具有无类型数据表源的 C# ReportViewer
【发布时间】:2010-01-05 21:14:16
【问题描述】:

我查看了问题的历史记录、访问了谷歌和其他结果,但仍然对 C# reportViewer 完全感到困惑。它似乎只想使用“类型化”数据集。正如许多其他人所询问的那样,我没有看到真正的答案,也许新的帖子会带来新的东西。

在最简单的形式中,我有一个从数据库执行查询的业务对象。我知道生成的列是什么,并希望将其插入到我需要的正确“格式化”的特定报告中,而不是简单的列式转储。

由于查询返回一个“DataTable”对象,但没有已知的列被“输入”,我被淹没了。

正如其他帖子中提到的,如果我有一个包含 200 多个表、400 多个视图和 200 多个存储过程的系统,我不想对所有内容进行类型转换。特别是如果我正在执行一个新查询,该查询是从某个新存储过程连接的单个表的结果。

绘制报告应该不难。如果我输入了错误的列,或者 SUM()、COUNT() 或其他错误,那是我的错,但至少让我将一个未输入的表格放入报告中。

帮助...

【问题讨论】:

    标签: c# reportviewer untyped-variables


    【解决方案1】:

    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 作为其数据源并使用它来填充表格。

    这就是你所追求的吗?

    【讨论】:

    • 关闭,我已经在查看此基础的其他示例。但是,当我尝试设计报告时,我不断收到有关异常字段/值设置的错误消息。因此,从上面的示例中,您将如何识别报告文本框输出的“值”元素......类似于 =First(Fields!DataColumn1.Value, "DataSet1_DataTable1") ???我的尝试有编译器错误...
    • 是的,这正是你要做的。如果报表中只有一个数据源,则无需在文本框中命名数据源。 DataColumn1 是 DataSet 中列的名称。当您使用数据集设计器在 VS 中设计数据集并添加表然后添加列时,“DataColumnX”是它的默认名称。我有一篇博客文章谈到了我采用的方法:blogs.msdn.com/magreer/archive/2008/10/16/…可能有帮助,也可能没有,有很多不同的方法可以设置查看器
    • 我的博客条目和我在这里建议的不同之处在于,如果您不想要,您不必为每列实际定义一个强类型,只需将它们保留为字符串即可。您可以设置非常通用的数据集,其中只有 X 列,全部命名为“Column0”到“ColumnX”,并且在运行时您可以设置 DataTable 以适应此模式。报告确实期望数据有特定的模式,这确实限制了报告的动态程度,另一种方法是动态生成 RDL,这完全是另一回事。
    • 好吧,要跳过多少杂七杂八的东西……历史上在 VFP 中开发,您在设计时为您的文本框控件放置了任何您想要的东西。在运行时,如果它没有找到您想要的东西,它会阻塞并修复您的查询。是的,强大的类型转换很棒,但是如果您动态地构建查询——字段、列等,我可以理解为什么这么多人会对这样一种锁定的报告机制感到沮丧,这种机制可以防止有人在自己的脚下开枪。跨度>
    猜你喜欢
    • 1970-01-01
    • 2012-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多