C#为自定义InvoiceDS填充行并返回已填充DataSet供Crystal Report使用
问题根因
- 你之前尝试编写
DataSet ds = DataSets.InvoiceDS逻辑无法运行,核心原因是InvoiceDS是你在Datasets文件夹下定义的强类型DataSet类,不是已经创建好的对象实例,直接把类名赋值给DataSet变量本身不符合C#语法规则,自然无法拿到可用的对象。 - 原方法的返回值类型是单个
tbl_InvoiceDataTable,和你需要返回完整填充行的DataSet的目标不匹配,直接返回单表也容易导致Crystal Report出现架构校验不通过的绑定错误。
可直接落地的修改方案
- 将方法的返回值类型从单个DataTable修改为你定义的强类型DataSet类型
Datasets.InvoiceDS - 方法内部优先实例化整个InvoiceDS对象,再从实例中取出对应的发票明细表做行填充,不要单独创建游离的DataTable对象
- 填充完成后直接返回完整的DataSet实例,而非单表
修改后的可运行代码如下:
public static Datasets.InvoiceDS GetData() { // 实例化完整的强类型DataSet对象 Datasets.InvoiceDS invoiceDs = new Datasets.InvoiceDS(); // 从实例中取出对应的发票数据表 Datasets.InvoiceDS.tbl_InvoiceDataTable dtc = invoiceDs.tbl_Invoice; // 按原有逻辑创建新行并填充字段 Datasets.InvoiceDS.tbl_InvoiceRow dtr = dtc.Newtbl_InvoiceRow(); dtr["Code"] = ""; dtr["Description"] = ""; dtr["Quantity"] = ""; dtr["Unit"] = ""; dtr["UnitPrice"] = ""; dtr["Tax"] = ""; dtr["NettPrice"] = ""; dtc.Rows.Add(dtr); // 返回已经完成行填充的完整DataSet return invoiceDs; }
注意不要在实例化InvoiceDS之后,又单独新建独立的
tbl_InvoiceDataTable对象,这类脱离DataSet实例创建的表对象,就算填充了行也不会归属到DataSet的表集合里,最终返回的DataSet依然是空表。一定要从实例化的DataSet中取出内置的表对象再做行填充。绑定Crystal Report时,直接将方法返回的DataSet实例赋值给报表的数据源属性即可,由于强类型DataSet的架构和你设计报表时选用的数据集结构完全一致,不会出现字段映射错位的问题。
内容的提问来源于stack exchange,提问作者Juan du Toit
相关产品推荐
相关产品推荐

