如何将字符串变量转换为c#中的复选框对象名称

本文关键字:复选框 对象 字符串 变量 转换 | 更新日期: 2023-09-27 18:14:55

我想更改代码中现有CheckBox对象的属性:

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;
}

上面的代码片段不会导致编译错误,但会导致运行时错误

对象引用未设置为对象的实例。

我该怎么办?

如何将字符串变量转换为c#中的复选框对象名称

我假设你说的是WinForms

你不能那样做。下面一行将null赋值给myCheckBox,因为objCheckBox的类型是string,而不是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方法将找不到它。为了确保总能找到它,你还需要递归地搜索容器控件——例如:如果你发现一个控件是Panel,你还需要搜索面板的子控件。


我根据注释编辑了我的代码——只是还记得Find方法。

由于

这一行,您所展示的代码片段产生了该异常
CheckBox myCheckBox = objCheckBox as CheckBox;

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

在您的例子中,objCheckBoxstringstring不能转换为CheckBox,因此保存在myCheckBox中的结果为null


请使用以下方法之一:

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