这应该有用..我想...
string ctrlName = "btnSomeButton" + someIndexValue;
this.Controls[ctrlName].Text = "Some value";
我得到'对象引用未设置为对象的实例。',控件确实存在于表单上。我已经尝试过它。
解决方案:
string ctrlName = "btnSomeButton" + someIndexValue;
Control[] ctrl = this.Controls.Find(ctrlName, True);
Button btn = (Button)ctrl[0];
btn.Text = "Some Value";
谢谢。
答案 0 :(得分:0)
控件可能是嵌套控件,因此您将不得不深入挖掘“this”的控件树
这是一个简单的递归控制搜索工具,我写的没有测试它,但我认为它应该适合您的需求:
private Control FindControl(Control ctr, string name)
{
Control c = null;
for (int i = 0; i < ctr.Controls.Count; i++)
{
if (string.Equals(ctr.Controls[i].ID, name, StringComparison.CurrentCultureIgnoreCase))
{
c = ctr.Controls[i];
break;
}
if (ctr.Controls[i].Controls.Count > 0)
{
c = FindControl(ctr.Controls[i], name);
if (c != null)
break;
}
}
return c;
}
答案 1 :(得分:0)
你的立即 ctrlName
集合中是否真的有一个名为Controls
的控件?它可能是层次结构中更深层的控件的名称,甚至是不存在的控件。
尝试递归地找到控件:
string ctrlName = "btnSomeButton" + someIndexValue;
Control[] matchingControls = this.Controls.Find(ctrlName, true);
foreach (Control c in matchingControls)
c.Text = "Some value";
答案 2 :(得分:0)
您的按钮实际上是在表单上控制,还是他们有不同的父级?例如,如果按钮位于Panel
或GroupBox
内,则只需使用this
即可通过名称访问它们。您需要在容器中找到它们。
示例:myPanel.Controls[ctrlName].Text = "Some Value"
答案 3 :(得分:0)
您可以使用下面的控制方法来确定控件的位置,即父级可能分配了此控件。
{
Control[] ctls = this.Controls.Find("Button2", true);
if (ctls.Length > 0)
{
Button btn = ctls[0] as Button;
if (btn != null)
btn.PerformClick();
}
else
MessageBox.Show("Not Found");
}
private void button2_Click(object sender, EventArgs e)
{
MessageBox.Show("Button2 Clicked");
}
答案 4 :(得分:0)
根据您的要求,您可能需要考虑创建一个Dictionary<string, Control>
集合,以便您按名称快速引用控件。这也使您无需使用包含索引的控件名称。