设置本地报表的数据源-.NET&;报表查看器

本文关键字:报表 amp 数据源 设置 NET | 更新日期: 2023-09-27 18:19:50

我创建了一个自定义控件(一个带有报表查看器的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"

我不完全确定如何设置数据源?我需要的数据存储在远程数据库中。。。我该怎么做才能建立这个连接?

设置本地报表的数据源-.NET&;报表查看器

您需要创建一个ReportDataSource,并设置其Value属性,例如DataTableIEnumerable是支持的源

举个例子,假设存在一个返回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";

请注意,资源字符串必须包括资源(包括程序集)的完全限定名称。

StuartLC如上所述回答了我的关键。。。进一步澄清的是,当他说"必须与RDLC中的DataSource匹配"时。。它实际上是"DataSetName"元素值re:<DataSetName>DataSet1</DataSetName>

我反复讨论,因为它被称为"DataSource",所以我一直使用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();
        }

您可以只使用数据表而不是数据集。更改此项:

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;