【问题标题】:C# Dynamic Reference of Controls控件的 C# 动态引用
【发布时间】: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


【解决方案1】:

该死。所以,在这个工作了一天之后,我终于找到了答案。

郑重声明:如果您曾经尝试引用与此处演示的内容类似的内容,请确保您引用了包含在其中的 GROUPBOX。 gbAvg.lSectAvg1 就是答案。我应该把它包含在问题中,但我什至没有意识到它是相关的。

不过,感谢大家的帮助。

现在我已经浪费了太多时间了,我终于可以继续我的生活了............

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-07-12
    • 1970-01-01
    • 2012-12-10
    • 1970-01-01
    • 1970-01-01
    • 2021-12-15
    • 1970-01-01
    • 2012-07-11
    相关资源
    最近更新 更多