在 C# 中使用循环将数组列表参数传递给 Crystal 报告

Passing array list parameter into Crystal Report using loop in C#

public List<string>  _DELIVERYNO;
private void get_INVOICE_DATA_RPT()
{ 
  _DELIVERYNO = new List<string>();
   foreach (DataGridViewRow row in grdDNList.Rows)
   {
    DataGridViewCheckBoxCell chk = row.Cells[0] as DataGridViewCheckBoxCell;
    if (Convert.ToBoolean(chk.Value) == true)
       if (row.Cells.Count >= 2 && row.Cells[2].Value != null) 
          {                          
             _DELIVERYNO.Add(row.Cells[2].Value.ToString());
          }
     }
    foreach (var value in list)
     {
        get_INVOICE_DATA(value);                   
     }               
 }

从 DataGridView 获取交货编号并存储到列表。

参数从frm1传递给crystal报告OK

private void frmPrinINVOICE_02_Load(object sender, EventArgs e)
 {         
   var rpt = new ReportDocument();
   rpt.Load("rptSalesInvoice_02.rpt");
   rpt.SetDatabaseLogon(userName2, passWord2, @serverName2, databaseName2);
   rpt.Refresh();
   crystalReportViewer1.RefreshReport();
   foreach (var value in frm1._DELIVERYNO)
   {
      rpt.SetParameterValue("@DELIVERYNO", value);
   }               
   crystalReportViewer1.ReportSource = rpt;       
}

但报表源仅保留最后一次查询 return 的最后数据 DELIVERYNO 示例:DELIVERY No:6425,6758,6927 从 frm1 传递过来。但报告只显示最后一个查询 return by DELIVERY No:6927 .

所以我的问题是如何循环参数但它必须保留所有传递参数的所有数据return(交货编号:6425,6758,6927)

这里是 SQL 存储过程:

PROCEDURE [dbo].[proc_IVHead_Get_INVOICE_DATA]
    @DELIVERYNO nvarchar(50)
AS
    select *
        from [ENVNDIVDB].[dbo].[IVHead] a
        inner join [ENVNDIVDB].[dbo].[IVRecords] b
        on a.DELIVERYNO=b.DELIVERYNO        
     WHERE B.[DELIVERYNO] =@DELIVERYNO
     ORDER BY a.DELIVERYNO 

我们可以将循环结果存储到临时 table 然后从中取出数据吗?

您的循环会在每次迭代时替换参数值并保留最后一个值。请使用以下代码来获得正确的结果:

你的循环:

foreach (var value in frm1._DELIVERYNO)
{
   rpt.SetParameterValue("@DELIVERYNO", value);
}       

替换为:

var value = string.Join(",", frm1._DELIVERYNO);
rpt.SetParameterValue("@DELIVERYNO", value);

它将设置参数值:6425,6758,6927

frm1 传递 DELIVERY NO 的逗号分隔值并在下面添加 SQL 拆分分隔值

的服务器函数
CREATE FUNCTION dbo.Split(@String nvarchar(4000), @Delimiter char(1))
RETURNS @Results TABLE (colA nvarchar(4000))
AS
BEGIN
DECLARE @INDEX INT
DECLARE @SLICE nvarchar(4000)

SELECT @INDEX = 1
WHILE @INDEX !=0
BEGIN

SELECT @INDEX = CHARINDEX(@Delimiter,@STRING)
IF @INDEX !=0

SELECT @SLICE = LEFT(@STRING,@INDEX - 1)
ELSE
SELECT @SLICE = @STRING

INSERT INTO @Results(colA) VALUES(@SLICE)

SELECT @STRING = RIGHT(@STRING,LEN(@STRING) - @INDEX)

IF LEN(@STRING) = 0 BREAK
END
RETURN
END

上次更改您的存储程序

PROCEDURE [dbo].[proc_IVHead_Get_INVOICE_DATA]
    @DELIVERYNO nvarchar(50)
AS
    select *
        from [ENVNDIVDB].[dbo].[IVHead] a
        inner join [ENVNDIVDB].[dbo].[IVRecords] b
        on a.DELIVERYNO=b.DELIVERYNO        
        inner join DBO.Split(@DELIVERYNO,',') c 
        on B.[DELIVERYNO] = c.[colA] 
     ORDER BY a.DELIVERYNO