【问题标题】:set report viewer parameters programmatically以编程方式设置报表查看器参数
【发布时间】:2014-02-04 20:27:11
【问题描述】:

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

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");

我得到了我之前说的结果。

【问题讨论】:

  • "第一个参数具有所有其他参数的值。" - 你这是什么意思?
  • 以下几个有效答案。而且,您对SetReportParameters 的调用甚至不会编译。存根需要string[],但您正在传递它string string...

标签: c# reportviewer


【解决方案1】:

我认为这属于“滥用 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 的长度。代码相当不清楚,你的意图没有写出来,我可以看到。但我会“取消优化”这段代码,以便更容易在调试器中单步执行,然后在您的方法正常工作时进行优化。

【讨论】:

  • 天哪,我的错误,这是在你工作压力大的时候发生的,谢谢埃文,我为此道歉。
  • 如果它解决了您的问题,请将其标记为答案 =)
【解决方案2】:

嗯,ForEach 的问题解决了。

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

【讨论】:

    猜你喜欢
    • 2014-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多