You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#为自定义InvoiceDS填充行并返回已填充DataSet供Crystal Report使用

问题根因
  • 你之前尝试编写DataSet ds = DataSets.InvoiceDS逻辑无法运行,核心原因是InvoiceDS是你在Datasets文件夹下定义的强类型DataSet类,不是已经创建好的对象实例,直接把类名赋值给DataSet变量本身不符合C#语法规则,自然无法拿到可用的对象。
  • 原方法的返回值类型是单个tbl_InvoiceDataTable,和你需要返回完整填充行的DataSet的目标不匹配,直接返回单表也容易导致Crystal Report出现架构校验不通过的绑定错误。
可直接落地的修改方案
  1. 将方法的返回值类型从单个DataTable修改为你定义的强类型DataSet类型Datasets.InvoiceDS
  2. 方法内部优先实例化整个InvoiceDS对象,再从实例中取出对应的发票明细表做行填充,不要单独创建游离的DataTable对象
  3. 填充完成后直接返回完整的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.24 21:57:02