如何将字符串变量转换为CheckBox对象C#中的名称

yil*_*lah 3 c# winforms

我想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;
}
Run Code Online (Sandbox Code Playgroud)

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

你调用的对象是空的.

我该怎么办?

Tho*_*mar 7

我假设你在谈论WinForms

你不能这样做.以下行分配nullmyCheckBox,因为objCheckBox是类型的string,而不是类型的CheckBox.

CheckBox myCheckBox = objCheckBox as CheckBox;
Run Code Online (Sandbox Code Playgroud)

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

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

LINQ方法可能如下所示:

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

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


我根据评论编辑了我的代码 - 只记得这个Find方法.


O. *_*per 6

您显示的代码段会因为该行而产生异常

CheckBox myCheckBox = objCheckBox as CheckBox;
Run Code Online (Sandbox Code Playgroud)

as运营商试图投左操作数按正确的操作数指定的类型.如果演员表失败,结果将是null.

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


而是,使用以下方法之一:

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