【发布时间】:2015-09-23 15:10:43
【问题描述】:
我是 Crystal Reports 的新手,在使用 CR for Visual Studio 时很快遇到了问题。
我设计了一个仅包含两个子报表的报表。主报告根本没有进一步的数据。我创建了一个包含两个表的 DataSet (xsd) - 每个子报表一个。在 Visual Studio 中,我创建了两个子报表并添加了正确的表来插入数据字段。我没有在主报表中添加 DataTable,因为它没有自己的数据。这是在 Visual Studio 中使用模板设计器完成的(不确定名称是否正确)
在代码中,我将一些虚拟数据添加到 DataSet 的两个表中,并将正确的表添加到相应的子报表中。然后报表显示在 Crystal Report Viewer 中。但是根本没有数据,我得到一个空页面。
我已经确认 DataTables 正确填充了我的虚拟数据,并且使用了正确的报表和子报表。
我做错了什么?请参阅下面的代码:
DataSet1 ds1 = new DataSet1(); // my DataSet with 2 tables
report.DataSourceConnections.Clear(); //report is the ReportDocument with the correct Report
DataTable t1 = ds1.Tables.Add("DataTable1");
t1.Columns.Add("Id", Type.GetType("System.String"));
t1.Columns.Add("Feld1", Type.GetType("System.String"));
DataTable t2 = ds1.Tables.Add("DataTable2");
t2.Columns.Add("Id", Type.GetType("System.String"));
t2.Columns.Add("Feld1", Type.GetType("System.String"));
t2.Columns.Add("Feld2", Type.GetType("System.String"));
DataRow r;
int i = 0;
for (i = 0; i <= 9; i++)
{
r = t1.NewRow();
r["Id"] = i.ToString();
r["Feld1"] = string.Format("Item1{0}", i);
t1.Rows.Add(r);
}
DataRow r2;
int i2 = 0;
for (i2 = 0; i2 <= 9; i2++)
{
r2 = t2.NewRow();
r2["Id"] = i2.ToString();
r2["Feld1"] = string.Format("Item1{0}", i2);
r2["Feld2"] = string.Format("Item2{0}", i2);
t2.Rows.Add(r2);
}
report.Subreports[0].DataSourceConnections.Clear();
report.Subreports[1].DataSourceConnections.Clear();
report.Subreports[0].SetDataSource(ds1.Tables[0]);
report.Subreports[1].SetDataSource(ds1.Tables[1]);
报告导出为 PDF 文件:
report.ExportToDisk(ExportFormatType.PortableDocFormat, "D:\\test.pdf");
【问题讨论】:
-
您将子报表放在了哪个部分?如果您将它们放在详细信息部分,它们将不会显示,因为如果主报告没有数据,详细信息部分不会显示。
-
所以主报表必须有自己的数据才能显示子报表?为什么?如果主报表只是充当不同子报表的容器,我该怎么办?
-
经过反复试验,我注意到主报告只需要通过字段资源管理器添加一个数据表。我什至不需要将该 DataTable 的某些字段添加到主报告中以供上级报告显示。这被认为是错误还是功能?
-
主报表不需要数据。仅当您想使用详细信息部分时。您可以尝试将子报表移动到报表标题部分。
-
@heringer:请在下面的回答中查看我的评论。
标签: datatable crystal-reports dataset subreport