如何按类型定位控件?
我有一个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'名称'的实例
然后可以访问它(已经存在的)属性进行操作?
答案 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';
如果您不提前知道类型,可以使用反射来访问属性,但我需要有一个更好的例子来说明您首先想要做的事情......