如何在C#中通过循环将列表参数传入Crystal Report并从DataGridView获取Delivery No
我来帮你梳理下如何把提取到的_DELIVERYNO列表传入Crystal Report,这里有两种常见的实用方法,你可以根据自己的报表需求来选:
先提个小细节
你现有代码里最后那个循环的list应该是_DELIVERYNO吧?不然会报未定义的错误,记得先修正过来哦😉
方法1:用Crystal Report的多值参数传递(最常用)
Crystal Report本身支持接收多值参数,这是传递多个Delivery No最直接的方式,步骤如下:
在报表设计器里准备参数
打开你的Crystal Report,创建一个新参数,命名为@DeliveryNos(名字可自定义,但要和代码里对应),类型选“字符串”,并且勾选「允许多个值」选项。在C#代码里给参数赋值
你可以在get_INVOICE_DATA_RPT方法结束后,添加这段代码来传递参数:// 假设你已经实例化了报表对象,替换成你的报表类名 ReportDocument crReport = new YourReportFileName(); // 创建参数值集合 ParameterValues paramValues = new ParameterValues(); foreach (string deliveryNo in _DELIVERYNO) { ParameterDiscreteValue discreteVal = new ParameterDiscreteValue(); discreteVal.Value = deliveryNo; paramValues.Add(discreteVal); } // 给报表参数赋值 crReport.SetParameterValue("@DeliveryNos", paramValues); // 抑制参数提示框(不需要用户输入的话添加这句) crReport.ParameterFields["@DeliveryNos"].CurrentValues = paramValues; // 最后绑定到报表查看器 crystalReportViewer1.ReportSource = crReport;在报表里使用参数
比如你要筛选数据的话,可以在报表的选择公式里写:{YourTableName.DeliveryNo} in {?@DeliveryNos}这样报表就只会显示匹配这些Delivery No的数据啦。
方法2:把列表转成临时数据源绑定(适合展示列表本身)
如果你的报表需要直接展示所有选中的Delivery No,或者要基于这个列表做更复杂的逻辑,可以把_DELIVERYNO转成DataTable作为报表的数据源:
创建临时DataTable并填充数据
private void BindDeliveryNosAsDataSource() { // 创建一个只有DeliveryNo列的DataTable DataTable dtDelivery = new DataTable(); dtDelivery.Columns.Add("DeliveryNo", typeof(string)); // 把列表里的内容填充进去 foreach (string no in _DELIVERYNO) { DataRow row = dtDelivery.NewRow(); row["DeliveryNo"] = no; dtDelivery.Rows.Add(row); } // 绑定到报表 ReportDocument crReport = new YourReportFileName(); crReport.SetDataSource(dtDelivery); crystalReportViewer1.ReportSource = crReport; }报表设计器里匹配数据源
在报表设计时,你需要添加这个DataTable作为数据源(可以通过「ADO.NET数据集」定义结构,或者直接导入临时DataTable的结构),然后把DeliveryNo字段拖曳到报表的合适位置即可。
一些注意点
- 代码里的报表类名、参数名、字段名一定要和报表设计器里的完全一致,Crystal Report是大小写敏感的哦。
- 如果用多值参数,一定要在报表设计时勾选「允许多个值」,不然代码里传多个值会报错。
内容的提问来源于stack exchange,提问作者Cát Tường Vy
相关产品推荐
相关产品推荐

