君子,
在构建这个问题之前,我读了30多个搜索条目(并尝试了所有搜索条目),其中大部分都没有回复。虽然这是我第一次在这里提出问题,但这是我最喜欢的地方,可以获得超过10年的答案。所以这里...我创建了以下代码来接受来自我的数据集的数据在另一个页面上并在报表查看器中传播它。
//Creates the Grid View
dataGridViewReport.DataSource = null;
dataGridViewReport.DataSource = ds.Tables[0].DefaultView;
//Creates the Report
reportViewer1.LocalReport.DataSources.Clear();
this.reportViewer1.LocalReport.ReportPath = Application.StartupPath + @" \Report1.rdlc";// @"C:\Users\Pat\Documents\Visual Studio 2010\Projects\TTW 151200\TTW\Report1.rdlc";
DataTable dt = ds.Tables[0];
dt.TableName = "DataSet1";
ReportDataSource rds = new ReportDataSource("DataSet1", dataGridViewReport.DataSource);
reportViewer1.LocalReport.DataSources.Add(rds);
reportViewer1.RefreshReport();
页面加载时,此页面接受构造函数中的数据集值,并在上面的代码中使用它。到目前为止,这一直是一次考验,但我认为这可能会很接近。我认为问题可能是找不到报告文件,尽管它不再抛出该错误。现在,当我创建报告文件(Report1.rdlc)时,它与其他表单文件一起出现。我认为我读到的是,这将在RUNTIME上位于/ bin OR / release文件夹中,但它似乎不存在,也不能将其复制到该位置。我无法找到实际路径的位置,只能查找未运行的路径。所以...首先,我不确定我是否有正确的代码来创建报告,但它不再抛出任何错误。视图显示只是说它无法找到此文件。其次,我应该指向哪里,以便此代码(或任何代码)具有正确的文件路径,以便可以创建报告。最后,我不理解需要数据集名称的参数,所以我只是复制了一些我认为可行的代码实例。我将构建操作更改为嵌入式资源,并在属性表中将复制复制到输出复制到始终(尽管它从未对我有用)。请帮忙。一个简单,清晰的代码片段将帮助我恢复理智!谢谢!
答案 0 :(得分:0)
使用安装程序安装应用程序后,将ReportPath
设置为Application.StartupPath
+ <report name>
(使用Path.Combine更好地使用字符串连接)可能是正确的。
但在调试过程中你必须考虑:
exe
,dll
等)位于bin
文件夹(bin
,bin\Debug
或bin\Release
)rdlc
文件保留在原始项目文件夹中所以你可以实现一个这样的功能(对不起VB.NET代码):
Private Function strRdlcFilePath(ByVal strRdlcFile As String) As String
If Debugger.IsAttached And IO.File.Exists(IO.Path.Combine("<path to your project folder>", strRdlcFile)) Then
strRdlcFilePath = IO.Path.Combine("<path to your project folder>", strRdlcFile)
ElseIf Not Debugger.IsAttached And IO.File.Exists(IO.Path.Combine(Application.StartupPath, strRdlcFile)) Then
strRdlcFilePath = IO.Path.Combine(Application.StartupPath, strRdlcFile)
Else
'worst case: use an OpenFileDialog to manually select your rdlc file
strRdlcFilePath = "YourOpenFileDialog.FileName"
End If
End Function
将ReportPath
设置为:
reportViewer1.LocalReport.ReportPath = strRdlcFilePath("Report1.rdlc")
关于数据集问题,我认为您的代码是正确的,但之前声明DataTable
使用它更好:
ReportDataSource rds = new ReportDataSource(dt.TableName, dt);