将 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
名称是 dt
,ReportViewer
控件是 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
只是显示为空白。没有错误或任何迹象表明可能出了什么问题。
DataTable
dt
中的信息都是正确的(通过在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的主要内容,如果未能解决你的问题,请参考以下文章