使用控件名称更改控件上的属性时出现问题

时间:2010-06-16 13:28:54

标签: c#

这应该有用..我想...

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

谢谢。

5 个答案:

答案 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)

您的按钮实际上是在表单上控制,还是他们有不同的父级?例如,如果按钮位于PanelGroupBox内,则只需使用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>集合,以便您按名称快速引用控件。这也使您无需使用包含索引的控件名称。