将 DataTable 绑定到 RDLC 和 ReportViewer

Posted

技术标签:

【中文标题】将 DataTable 绑定到 RDLC 和 ReportViewer【英文标题】:Bind DataTable to RDLC and ReportViewer 【发布时间】:2014-03-07 23:49:06 【问题描述】:

我已经阅读了所有关于此的 SO 问题和在线文章,但我在几个不同的情况下感到困惑。

在我的项目中,我尝试手动创建报告 (Report2.rdlc) 并将不同字段从 DataSources 拖到报告上,并将该报告用作ReportViewer 的数据源。这没有用。我需要使用我从SqlDataAdapter 创建的DataTable,因为它会解密特定的行。我尝试创建一个DataSet 并用DataTable 填充它,但是我也无法执行此操作。

    我不明白:如果我有一个ReportViewer 控件 WinForm,我需要在代码中将数据源绑定到它。 代码是否甚至创建报告并将报告用于 ReportViewer?

DataTable 名称是 dtReportViewer 控件是 rv1

这是我一直在玩弄的代码,但我不知道该写什么 Report Path

    Dim RDS1 As ReportDataSource = New ReportDataSource("Test Report", dt)

    rv1.LocalReport.DataSources.Clear()
    rv1.ProcessingMode = ProcessingMode.Local
    rv1.LocalReport.EnableExternalImages = True
    rv1.LocalReport.ReportEmbeddedResource = "Your Report Path"
    rv1.LocalReport.DataSources.Add(RDS1)`.

最糟糕的是,ReportViewer 只是显示为空白。没有错误或任何迹象表明可能出了什么问题。

DataTabledt 中的信息都是正确的(通过在DGV 中查看来验证)。我只是想在Report / ReportViewer 中使用该数据。

任何人有什么建议吗?我似乎无法在这个问题上休息一下。 注意:导出到 Excel 不是一种选择。有需要解密的加密值。报告必须是可打印的。

编辑:这是我填充数据表的方式:

        Dim cmd As New SqlCommand
        cmd.CommandText = "Select * FROM Participant " & _
                          "WHERE FIRST_NM_TXT = @searchFirst " & _
                          "OR LAST_NM_TXT = @searchLast"
        cmd.Parameters.AddWithValue("@searchFirst", SearchFirstTxt.Text)
        cmd.Parameters.AddWithValue("@searchLast", SearchLastTxt.Text)

    Dim adapter As New SqlDataAdapter(cmd)
    adapter.Fill(dt)

所以,这里有包含正确数据的 DataTable。然后我去了项目名称,添加了一个新报告(Report1.rdlc),从这里我不确定接下来的步骤。如果我动态创建一个 DataSet,我应该在这个窗口中看到它吗?


由于这似乎是一个受欢迎的主题,我将解释我是如何通过快速/简单的步骤做到这一点的。

    右键单击您的项目 -> 添加新项目 -> 选择 Report.rdlc 左上角(数据源) -> 新建 -> 数据集(选择数据库 [下一步 ->] 数据集 [下一步 ->] 您的数据库连接。 “选择数据库对象”屏幕 -> 选择表 “选择数据集”屏幕 -> 这将在运行时重置。 请务必记住此数据集的名称,因为它将在代码中使用。 将 ReportViewer 控件(在 Reporting 下)添加到表单中。选择reportviewer 控件并转到属性(VS 中的右下窗格)。选择 Local Report 的属性并将 ReportEmbeddedResource 设置为指向我们刚刚创建的报告路径。 ** ProjectName.ReportName.rdlc**

    照常做:

    Public DataSet FillDS()
    //Try Catch block & other code omitted
    Dim cmd As New SqlCommand
    cmd.CommandText = "Select * FROM Participant " & _
                      "WHERE FIRST_NM_TXT = @searchFirst " & _
                      "OR LAST_NM_TXT = @searchLast"
    cmd.Parameters.AddWithValue("@searchFirst", SearchFirstTxt.Text)
    cmd.Parameters.AddWithValue("@searchLast", SearchLastTxt.Text)
    
    Dim adapter As New SqlDataAdapter(cmd)
    adapter.Fill(dt)
    

然后,我们在运行时绑定数据源。

DataSet yourDS = FillDS();
ReportDataSource rds = New ReportDataSource("YourDataSetNameFromStep4", yourDS.Tables[0]);
yourReportViewerName.localreport.datasources.clear();
yourReportViewerName.localreport.datasources.add(rds);
yourReportViewerName.refreshreport();

如果有什么我可以在这里发布以帮助其他人,请告诉我。

【问题讨论】:

需要检查的一些事项:“测试报告”必须是报告设计器中使用的名称。它区分大小写。 dt 也必须与报表设计器中使用的名称匹配。我认为您应该使用数据集而不是表格。 “您的报告路径”应采用“namespace.reportname.rdlc”的形式。区分大小写。 @peterG 感谢您的回复!我已经坚持了一周。让我再解释一下。所以我真的要去我的项目名称,添加一个报告,然后从那里开始????另外,我应该将 ReportViewer 控件拖到表单上,对吗?我在尝试使用 DataSet 时遇到的问题是,当我创建报表时,我动态创建的 DataSet 不在对象列表中。因此,我什至不确定我的 DataSet 是否正常工作。 您必须首先将数据集放入您的数据源窗口。这定义了您将使用的架构。 (您可以使用临时查询在运行时填充它,并使用从用户选择的选项构建的 WHERE 子句)此外,您对“路径”的使用可能表明另一点混乱:有两种方法可以指定报告:要么作为文件,要么作为资源。我们在这里使用后者。 @peterG 是的,这正是我正在做的。 (“使用临时查询......”)。这是我的主要困惑,也是我缺乏方向的地方。如果我要提供更多代码,您能否进一步指导我?在这个关头,我几乎是无助的。 是的,开火吧 - 在您的问题中添加一些代码 【参考方案1】:

需要检查的一些事项: “测试报告”必须是报告设计器中使用的名称。它区分大小写。 dt 也必须与报表设计器中使用的名称匹配 “您的报告路径”应采用“namespace.reportname.rdlc”的形式。区分大小写。

编辑: 我通常使用的方法利用了一个额外的层,以 BindingSource 的形式如下: 使用即席查询和 SqlDataAdapter 填充强类型数据集。 调暗 Bindingsource 并将其 DataSource 设置为数据集,并将其 DataMember 设置为表名。 调暗 ReportDataSource 并将其名称设置为报表设计器中使用的名称,并将其值设置为 BindingSource 例如

 Using cn As New SqlConnection(gcs)
        cn.Open()
        Dim sa As New SqlDataAdapter(sql, cn)
        sa.SelectCommand.CommandTimeout = cGlobals.ReportTimeout
        sa.Fill(ds, "Foos")
    End Using
    bs.DataSource = ds
    bs.DataMember = "Foos"
    Dim rds As New ReportDataSource
    rds.Name = "dsFooList_Foos"
    rds.Value = bs
    rv1.LocalReport.DataSources.Add(rds)

    Me.Show()
    rv1.RefreshReport()

编辑 2:在您的屏幕截图中,下拉数据源并选择您想要的。然后它将出现在“报告数据”窗口中,该窗口可能隐藏在“查看”菜单中(仅当您使用报告时才会出现)然后您可以从工具箱中将表格添加到报告中,然后拖动从“报告数据”窗口到表格单元格的字段。

【讨论】:

我有几个问题,你认为我可以“编辑”你的答案并让你填空吗?再次感谢。 当然(我要AFK一段时间) 这听起来很荒谬,但我对我们的重叠感到困惑。我应该将我的原始代码发布在 OP 中吗?另外,“强类型数据集”是什么意思? 哦,对了,如果您不熟悉强类型数据集,那么我们还有更远的路要走。 VS 中对报表的所有设计时支持都假定您使用的是强类型数据集或对象——即具有属性的东西。抱歉,我无法在 SO 答案中为您提供 ST 数据集的教程 - 您必须自己研究。但是要开始,请转到“数据源”窗口并单击“添加新数据源”闪亮的圆柱体图标。可能可以将报表绑定到弱类型数据集 - 我从未尝试过 - 但使用 ST 开始要容易得多。 好的,在我试图弄清楚如何完成整个报告的迷宫中,我实际上已经这样做了 3-4 次。不过,从来没有做对过。我将使用“数据库”还是“对象”?由于我们将使用临时查询,我不确定该选择哪个。【参考方案2】:

我为我的“报告加载器”做了类似的事情,请检查这个链接,它是用 C# 编写的,但它会给你一个想法。

How to bind dynamically datasource to reportviewer on windows forms c#

【讨论】:

谢谢,多夫拉。信不信由你,我丢失的唯一代码是CreateDataReader()。不过感谢来源!这是很好的信息。

以上是关于将 DataTable 绑定到 RDLC 和 ReportViewer的主要内容,如果未能解决你的问题,请参考以下文章

将数据集动态绑定到 RDLC 报告

将 DataGrid 绑定到两个 DataTable

如何将 DataTable 绑定到 Datagrid

C# 将 DataTable 绑定到现有 DataGridView 列定义

报告 rdlc 中的外部图像

将行号列添加到绑定到 DataTable 的 DataGridView