【发布时间】:2015-08-27 23:05:56
【问题描述】:
好吧,总结一下:
我有 3 个标签:lSectAvg1、lSectAvg2、lSectAvg3。
lMask 应该通过此方法“CalcResults”的顺序迭代来动态引用其中的每一个。
private void CalcResults(int[] numSet, int arrayCount, ref double max, ref double min)
{
int count = 0;
double sum = 0;
//lMask is assigned. First value is "lSectAvg1".
Control lMask = this.Controls["lSectAvg" + arrayCount.ToString()];
while (count < numSet.Count())
{
sum = sum + numSet[count];
if (numSet[count] > max)
max = numSet[count];
if (min == 0 || numSet[count] < min)
min = numSet[count];
count++;
}
//Basically: "lSectAvg1.Text is set to the average."
lMask.Text = (sum / count).ToString("n2");
}
但是,我最终在代码的最后一行出现错误:“对象引用未设置为对象的实例。”
什么给了? “this.Controls”应该有所不同吗?我的方法/“控制”变量的范围可能有问题吗?
基本上:是否有类似于 SQL 中的“EXEC”命令的东西,可以将字符串作为代码执行?
谢谢一百万!
编辑:我还应该补充一点,抛出错误后 lMask 的值为“null”。
【问题讨论】:
-
您确定
arrayCount设置为1,而不是0? -
事后看来,也许这不是最干净的方法,但该方法的调用方式为: CalcResults(arrayJagged[count], count + 1, ref max, ref min);所以,是的,我已经确认它是 1。
-
this是什么?是表格吗?据我记得,this.Controls只返回孩子,而不是所有后代。因此,如果文本框在面板内,您可能需要将其更改为somePanel.Controls之类的内容 -
您的控件是
null,因为表单找不到具有指定名称的控件。您是否正确检查了"lSectAvg" + arrayCount.ToString()真的是您认为的那样? -
计数是控件的总数。您的数组基于零,因此将比计数少一。在您的方法上设置断点,查看您的数组并逐步执行您的方法。
标签: c# dynamic reference controls