[英]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報告就可以了
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;
}
但是報表源僅保留來自最后一個DELIVERYNO的最后一個查詢返回的最后一個數據的示例:交付編號:6425,6758,6927是從frm1傳遞的。 但是該報告僅顯示DELIVERY No:6927返回的最后一個查詢。
所以我的問題是如何循環參數,但必須保留所有傳遞的參數返回的所有數據(交付編號: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
我們可以將循環結果存儲到臨時表中,然后從中獲取數據嗎?
從frm1
傳遞傳遞的DELIVERY NO
逗號分隔值,並在下面的SQL Server函數中添加“分隔分隔值”
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
您的循環將用每次迭代替換參數值,並保留最后一個值。 請使用以下代碼獲得正確的結果:
您的循環:
foreach (var value in frm1._DELIVERYNO)
{
rpt.SetParameterValue("@DELIVERYNO", value);
}
替換為:
var value = string.Join(",", frm1._DELIVERYNO);
rpt.SetParameterValue("@DELIVERYNO", value);
它將參數設置為值: 6425,6758,6927
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.