以编程方式设置报表查看器参数

时间:2014-02-04 20:27:12

标签: c# reportviewer

我有这个方法通过它,我猜它填充了reportviewer参数,但是当我评估ReportParameters(this.reportViewer1.LocalReport.GetParameters())时,第一个参数具有所有其他参数的值。这有什么不对?此代码属于FrmReport(示例):

public void SetReportParameters(params string[] parameters){
    if (parameters.Length == ReportParameters.Count)
    {
        //ReportParameters = this.reportViewer1.LocalReport.GetParameters();
        ReportParameterCollection pCol = new ReportParameterCollection();
        int i = 0;
        parameters.ToList().ForEach(p => {
            pCol.Add(new ReportParameter(ReportParameters[i].Name, p));
        });
        this.reportViewer1.LocalReport.SetParameters(pCol);
    }
}

然后我说另一种形式:

var frmReport = new FrmReport();
frmReport.SetReportParameters("1","2");

我得到的结果就像我之前说的那样。

2 个答案:

答案 0 :(得分:0)

我认为这将属于“误用ForEach”类别。你永远不会递增i(我能看到)这是你的主要问题。 .ToList().ForEach()的主要缺点是可读性差。

我认为你最好只使用循环,直到你得到你想要的结果,然后如果你真的必须继续并转换为LINQ。

    var pCol = new ReportParameterCollection();
    for (int i = 0; i < parameters.Length; i++)
    {
        pCol.Add(new ReportParameter(ReportParameters[i].Name, parameters[i]);
    }

真的不确定为什么要检查ReportParametersparameters的长度。代码相当不清楚,你的意图没有写出来,我可以看到。但是我会“取消优化”这段代码,以便在调试器中更容易一步,然后在方法正常工作时进行优化。

答案 1 :(得分:0)

好吧,ForEach的问题已经解决了。

int i = 0;
parameters.ToList().ForEach(p => {
    pCol.Add(new ReportParameter(ReportParameters[i].Name, p));
    i++;
});