我现在已经成功地完成了这项工作。
简要概述
它的工作原理是拥有一个“数据类”,它只是一个包含变量且没有代码的常规 C# 类。然后将其实例化并填充数据,然后放置在 ArrayList 中。ArrayList 与要加载的报表名称一起绑定到报表查看器。在报表设计器中使用“.Net Objects”,而不是与数据库通信。
解释
我创建了一个类来保存我的报告的数据。这个类是由我通过手动从数据库中检索数据来手动填充的。你如何做到这一点并不重要,但这里有一个例子:
DataSet ds = GeneratePickingNoteDataSet(id);
foreach (DataRow row in ds.Tables[0].Rows) {
CPickingNoteData pickingNoteData = new CPickingNoteData();
pickingNoteData.delivery_date = (DateTime)row["delivery_date"];
pickingNoteData.cust_po = (int)row["CustomerPONumber"];
pickingNoteData.address = row["CustomerAddress"].ToString();
// ... and so on ...
rptData.Add(pickingNoteData);
}
然后将该类放入 ArrayList 中。arraylist 中的每个元素对应于完成报告中的一个“行”。
列表中的第一个元素也可以保存报表页眉数据,列表中的最后一个元素可以保存报表页脚数据。因为这是一个 ArrayList,所以可以使用普通的 Array 访问来获取它们:
((CPickingNoteData)rptData[0]).header_date = DateTime.Now;
((CPickingNoteData)rptData[rptData.Count-1]).footer_serial = GenerateSerialNumber();
一旦你有一个充满数据的数组列表,像这样将它绑定到你的报表查看器,其中“rptData”的类型是“ArrayList”
ReportDocument reportDoc = new ReportDocument();
reportDoc.Load(reportPath);
reportDoc.SetDataSource(rptData);
crystalReportViewer.ReportSource = reportDoc;
现在您需要将数据类绑定到报表本身。您在设计器内部执行此操作:
- 打开“字段资源管理器”选项卡(可能位于“查看”菜单下),然后右键单击“数据库字段”
- 点击“项目数据”
- 单击“.NET 对象”
- 向下滚动列表以找到您的数据类(如果不存在,请编译您的应用程序)
- 按“>>”然后确定
- 您现在可以将班级成员拖到报告中并根据需要进行排列。