3

I want to change the property of an existing CheckBox object in my code:

string checkBoxName = "checkBox" + Convert.ToString(index);    
Object objCheckBox = checkBoxName;    
CheckBox myCheckBox = objCheckBox as CheckBox;

if (words[1] == "-1")
{
    myCheckBox.Checked = false;
}
else
{
    myCheckBox.Checked = true;
}

The code snippet above did not cause a compile error but caused a runtime error as

Object reference not set to an instance of an object.

What should I do?

4

2 回答 2

7

我假设你在谈论 WinForms

你不能那样做。以下行分配nullmyCheckBox, as objCheckBoxis typestring而不是 type CheckBox

CheckBox myCheckBox = objCheckBox as CheckBox;

您需要做的是遍历窗体上的所有控件以找到名为checkBoxName. 你可以通过 LINQ 来做,或者你可以这样做:

Control[] controls = this.Find(checkBoxName, true);
if (controls != null && controls.Length > 0)
{
    (controls[0] as CheckBox).Checked = words[1] != "-1";
}

LINQ 方法可能如下所示:

Control c = (from Control c in this.Controls where c.Name.Equals(checkBoxName) select c).FirstOrDefault();
if (c != null)
{
    ....
}

请注意,如果CheckBox不是表单本身的直接子级,则 LINQ 方法将找不到它。为确保始终找到它,您还需要递归搜索容器控件 - 例如:如果您找到一个为 a 的控件Panel,您还需要搜索面板的子控件。


我根据评论编辑了我的代码——也只是记住了Find方法。

于 2013-05-23T12:26:44.313 回答
6

由于该行,您显示的代码片段会产生该异常

CheckBox myCheckBox = objCheckBox as CheckBox;

as运算符尝试将左操作数转换为右操作数中指定的类型。如果强制转换失败,结果将是null.

在你的情况下,objCheckBox是一个string. string无法转换为CheckBox,因此保存的结果myCheckBoxnull.


相反,请使用以下方法之一:

  • 将所有复选框存储在一个数组中。然后,您将能够使用其索引(您似乎已存储在index变量中)直接访问该数组中的元素。
  • 根据您使用的 UI 工具包,应该有一种通过名称查找控件的方法。将完整的复选框名称传递给该方法,它将返回适当的CheckBox实例(如果找到)。
于 2013-05-23T12:29:52.523 回答