我有这个方法通过它,我猜它填充了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");
我得到的结果就像我之前说的那样。
答案 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]);
}
真的不确定为什么要检查ReportParameters
和parameters
的长度。代码相当不清楚,你的意图没有写出来,我可以看到。但是我会“取消优化”这段代码,以便在调试器中更容易一步,然后在方法正常工作时进行优化。
答案 1 :(得分:0)
好吧,ForEach的问题已经解决了。
int i = 0;
parameters.ToList().ForEach(p => {
pCol.Add(new ReportParameter(ReportParameters[i].Name, p));
i++;
});