我正在创建一个 C# 报告解决方案,其中包含多个 RDLC 报告以及每个 RDLC 文件后面的 ASPX 视图页面,并且这些报告使用本地数据集 (.xsd) 中的数据提供数据。数据集包含从 SQL 存储过程和数据表检索数据的表适配器。有些报表需要动态获取数据,并使用DataTable对象作为数据源与RDLC文件绑定。我正在按照以下步骤操作
1-在xsd数据集中创建DataTable对象
2-将数据集添加到RDLC报告中,类型为xsd数据集中创建的DataTable。
3- 在代码隐藏 ASPX 文件中,检索 IEnumerable 对象中的数据
4- 创建在(1)中创建的DataTable类的实例,并向该实例添加行
来自 IEnumerable
5- 使用 RDLC 报告中指定的数据集名称从 DataTable 对象创建 ReportDataSource 对象
6- 将 ReportDataSource 对象添加到报表查看器的 DataSource 集合中。
.xsd 数据集名称:WoqodEPIDataSet.xsd
RDLC 名称:JobCardsReport.rdlc
尽管如此,我仍然收到错误“尚未为数据源‘JobCards’提供数据源实例。”
RDLC 源代码(DataSource 和 DataSet 部分)
<?xml version="1.0" encoding="utf-8"?>
<Report xmlns="http://schemas.microsoft.com/sqlserver/reporting/2016/01/reportdefinition" xmlns:rd="http://schemas.microsoft.com/SQLServer/reporting/reportdesigner">
<AutoRefresh>0</AutoRefresh>
<DataSources>
<DataSource Name="WoqodEPIDataSet">
<ConnectionProperties>
<DataProvider>System.Data.DataSet</DataProvider>
<ConnectString>/* Local Connection */</ConnectString>
</ConnectionProperties>
<rd:DataSourceID>e747194e-5f0b-4c76-8a8c-1739db95ceef</rd:DataSourceID>
</DataSource>
</DataSources>
<DataSets>
<DataSet Name="JobCards">
<Query>
<DataSourceName>WoqodEPIDataSet</DataSourceName>
<CommandText>/* Local Query */</CommandText>
</Query>
<Fields>
<Field Name="Time">
<DataField>Time</DataField>
<rd:TypeName>System.String</rd:TypeName>
</Field>
</Fields>
<rd:DataSetInfo>
<rd:DataSetName>WoqodEPIDataSet</rd:DataSetName>
<rd:SchemaPath>C:\Users\OBA021\source\repos\APCReports\APCReports\WoqodEPIDataSet.xsd</rd:SchemaPath>
<rd:TableName>dt_JobCards</rd:TableName>
<rd:TableAdapterFillMethod />
<rd:TableAdapterGetDataMethod />
<rd:TableAdapterName />
</rd:DataSetInfo>
</DataSet>
</DataSets>
ASPX 后台代码:
public partial class JobCardsReport : System.Web.Mvc.ViewPage {
protected async Task Page_Load(object sender, EventArgs e) {
if (!IsPostBack) {
//retrieve station data
StationDataModel station = StationDataProcessor.RetrieveStationData();
Session["StationNo"] = station.StationNo;
Session["StationName"] = station.StationName;
//assign report parameters
var repParams = new ReportParameter[9];
repParams[0] = new ReportParameter("StationNo", Session["StationNo"].ToString());
repParams[1] = new ReportParameter("StationName", Session["StationName"].ToString());
repParams[2] = new ReportParameter("DateTo", Session["DateTo"].ToString());
repParams[3] = new ReportParameter("DateFrom", Session["DateFrom"].ToString());
repParams[4] = new ReportParameter("OpenedBy", Session["OpenedBy"].ToString());
repParams[5] = new ReportParameter("AssignedOperator", Session["AssignedOperator"].ToString());
repParams[6] = new ReportParameter("Status", Session["Status"].ToString());
repParams[7] = new ReportParameter("ReceiptNumber", Session["ReceiptNumber"].ToString());
repParams[8] = new ReportParameter("BusinessUnit", Session["BusinessUnit"].ToString());
this.JobCardsReport_ReportViewer.LocalReport.SetParameters(repParams);
dt_JobCardsDataTable dt = new dt_JobCardsDataTable();
dt.Adddt_JobCardsRow("2024-01-02");
ReportDataSource rds = new ReportDataSource("JobCards", (DataTable)dt);
JobCardsReport_ReportViewer.LocalReport.DataSources.Add(rds);
}
ASPX查看页面文件:
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="JobCardsReport.aspx.cs" Inherits="APCReports.ReportsView.JobCardsReport" %>
<%@ Register Assembly="Microsoft.ReportViewer.WebForms, Version=15.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91" Namespace="Microsoft.Reporting.WebForms" TagPrefix="rsweb" %>
<!DOCTYPE html>
<html>
<head runat="server">
<title>Job Cards Report</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:ScriptManager ID="ScriptManager1" runat="server"></asp:ScriptManager>
<!-- ReportViewer control -->
<rsweb:ReportViewer ID="JobCardsReport_ReportViewer" runat="server" AsyncRendering="False" Width="100%" Height="500px">
<LocalReport ReportPath="ReportViews/JobCardsReport.rdlc">
</LocalReport>
</rsweb:ReportViewer>
</div>
</form>
</body>
</html>
我之前有一份类似的报告,但在比较它们之后我找不到任何差异,并且我遵循完全相同的步骤。我看不出这里有什么问题
注意:为了简单起见,DataTable 仅具有一个字符串列,并且它提供简单的静态数据
您得到的错误
"A data source instance has not been supplied for the data source 'JobCards'."
具有误导性。 RDLC 源代码不是必需的。就你而言,它看起来很好。我之前看到和遇到的问题与文件的路径有关。它不适用于此类相对路径。我建议的修复是删除:
<LocalReport ReportPath="ReportViews/JobCardsReport.rdlc">
</LocalReport>
从 ASPX 文件中将其添加到后面的代码中:
JobCardsReport_ReportViewer.LocalReport.ReportPath = Server.MapPath("~/ReportViews/JobCardsReport.rdlc");
ReportDataSource rds = new ReportDataSource("JobCards", (DataTable)dt);
JobCardsReport_ReportViewer.LocalReport.DataSources.Add(rds);
请在调试器中检查构造的
ReportPath
是磁盘中的文件位置。