我创建了一个自定义控件(带有报表查看器的Windows窗体)。我有以下代码来加载本地报告:
包含在CustomReportViewer类
中//Load local report
this.reportViewer1.ProcessingMode = ProcessingMode.Local;
//enable loading of external images
this.reportViewer1.LocalReport.EnableExternalImages = true;
//pass the report to the viewer
using (FileStream stream = new FileStream(filename, FileMode.Open))
{
this.reportViewer1.LocalReport.LoadReportDefinition(stream);
}
我用这个来打电话:
CustomReportViewer reportViewer = new CustomReportViewer();
这很好用,会出现一个包含报告查看器控件的窗体但是我收到以下消息:
A data source instance has not been supplied for the data source "ReportData"
我不完全确定如何设置数据源?我需要的数据存储在一个远程数据库中...我该怎么办才能建立这个连接?
答案 0 :(得分:17)
您需要创建ReportDataSource,并设置其Value
属性 - 例如DataTable
和IEnumerable
是supported sources
作为一个示例,假设存在一个返回DataSet的方法,其中一个DataTable
与报告所需的列匹配:
DataSet ds = SomeMethodToRetrieveDataSet(); // e.g. via DataAdapter
// If your report needs parameters, they need to be set ...
ReportParameter[] parameters = new ReportParameter[...];
ReportDataSource reportDataSource = new ReportDataSource();
// Must match the DataSource in the RDLC
reportDataSource.Name = "ReportData";
reportDataSource.Value = ds.Tables[0];
// Add any parameters to the collection
reportViewer1.LocalReport.SetParameters(parameters);
reportViewer1.LocalReport.DataSources.Add(reportDataSource);
reportViewer1.DataBind();
请注意,将RDLC嵌入到程序集中通常更容易,而不必保留单独的RDLC文件。通过选择RDLC上的Build Action
作为Embedded Resource
来执行此操作,然后您可以设置ReportEmbeddedResource
属性:
reportViewer1.LocalReport.ReportEmbeddedResource =
"MyOrganisation.MyAssembly.NameSpace.MyReportName.rdlc";
请注意,资源字符串必须包含资源的完全限定名称(包括Assembly)。
答案 1 :(得分:8)
对我而言,关键在于StuartLC如上所述......进一步澄清,当他说'#34;必须与RDLC中的数据源相匹配时......它实际上是& #34;的DataSetName&#34;元素值re:<DataSetName>DataSet1</DataSetName>
我去了一圈又一圈,因为它被称为&#34; DataSource&#34;所以我继续使用DataSource元素名称,但显然在rdl和rdlc文件中这确实表示DataSetName。因此,请记住这一点是从上面借用我自己的Stuart借来的代码。请注意DataSetName元素值:
using (SqlConnection sqlConn = new SqlConnection(rvConnection))
using (SqlDataAdapter da = new SqlDataAdapter(rvSQL, rvConnection))
{
DataSet ds = new DataSet();
da.Fill(ds);
DataTable dt = ds.Tables[0];
this.reportViewer1.Reset();
this.reportViewer1.ProcessingMode = ProcessingMode.Local;
this.reportViewer1.LocalReport.ReportPath = AppDomain.CurrentDomain.BaseDirectory + "ssrsExport.rdlc";
ReportDataSource reportDataSource = new ReportDataSource();
// Must match the DataSet in the RDLC
reportDataSource.Name = "DataSet1";
reportDataSource.Value = ds.Tables[0];
this.reportViewer1.LocalReport.DataSources.Add(reportDataSource);
this.reportViewer1.RefreshReport();
}
答案 2 :(得分:0)
您也许可以只使用数据表而不是数据集。 更改此:
DataSet ds = new DataSet();
da.Fill(ds);
DataTable dt = ds.Tables[0];
对此:
DataTable dt = new DataTable();
da.Fill(dt);
这:
reportDataSource.Value = ds.Tables[0];
对此
reportDataSource.Value = dt;