如何按类型访问集合中的Control?

时间:2009-10-14 19:59:06

标签: c# winforms controls

如何按类型定位控件?

我有一个Control集合“TargetControls”

        List<Control> TargetControls = new List<Control>();
        foreach (Control page in Tabs.TabPages)
        {
            foreach (Control SubControl in page.Controls)

                TargetControls.Add(SubControl);
        }

        foreach (Control ctrl in TargetControls)...

我需要通过其特定类型访问每个现有控件(组合框,复选框等)并访问其特定属性。我现在这样做的方式只能让我访问通用控件属性。

我不能指定类似......

的内容

Combobox current = new ComboBox [“Name”]; ///引用ComboBox'名称'的实例

然后可以访问它(已经存在的)属性进行操作?

6 个答案:

答案 0 :(得分:6)

您可以使用关键字来检查特定类型的控件。如果控件属于特定类型,请进行类型转换。

foreach (Control SubControl in page.Controls)
{
    if (SubControl is TextBox)
    {
        TextBox ctl = SubControl as TextBox;
    }
}

答案 1 :(得分:2)

您可以使用OfType<T>扩展名方法:

foreach (var textBox = page.Controls.OfType<TextBox>()) {
   // ...
}

答案 2 :(得分:1)

在访问任何特定参数之前,您需要将控件转换为正确的控件类型。

ComboBox c = ctrl as ComboBox;
If (c != null)
{
   //do some combo box specific stuff here
}

此外,您可以将控件添加到通用dictionary<string, control>并使用control.name作为键。

实施例

Dictionary<string, Control> TargetControls  = new Dictionary<string, Control>();

答案 3 :(得分:1)

假设您可以使用LINQ,并且您正在寻找(比方说)一个Button控件:

var button = (from Control c in TargetControls
              where c.Name == "myName" && c is Button
              select c
             ).FirstOrDefault();

...它将为您提供集合中名为“myName”的第一个Button控件,如果没有此类项目,则为null。

答案 4 :(得分:1)

Find方法怎么样?

Button btn = (Button)this.Controls.Find("button1", true)[0];
            btn.Text = "New Text";

答案 5 :(得分:0)

要访问控件的特定属性,必须将其强制转换为适当的类型。例如,如果TargetControls集合中的项目是文本框,则必须说((TextBox)TargetControls[0]).Text = 'blah';

如果您不提前知道类型,可以使用反射来访问属性,但我需要有一个更好的例子来说明您首先想要做的事情......