【发布时间】:2013-02-20 14:26:04
【问题描述】:
当我在表单上迭代一堆不同的控件时,而不是尝试访问 Text 属性:
String text = String.Empty;
foreach(Control control in this.Controls)
{
try
{
text = control.Text;
}
catch(Exception exception)
{
// This control probably doesn't have the Text property.
Debug.WriteLine(exception.Message);
}
}
有没有办法确定给定控件是否具有 Text 属性?像这样的:
String text = String.Empty;
foreach(Control control in this.Controls)
{
if(control has Text property)
{
text = control.Text;
}
}
我绝对鄙视 Try/Catch 块(当然,除非没有更好的选择)。
【问题讨论】:
-
您可以使用反射,但是否只需要特定类型的控件?你可以做
if (control is TextBox || control is Label) -
是的,我有很多自定义控件,有些没有 Text 属性,有些有。此外,您在 VS 的工具箱中看到的任何(标准)控件都是(或可能是 - 取决于用户正在创建的内容)在表单上。虽然我可以使用您的方法,但仍有许多其他标准控件具有 Text 属性 - 如果它们有,我将需要它。 :-)
-
从 Control 派生的任何对象都有一个名为 Text 的属性。
-
@JasonVoorhees 从
Control派生的所有对象都具有Text属性。如果他们没有,您的代码将无法编译。但是,该属性隐藏在不支持它的控件的设计器中。即使您的自定义控件没有覆盖Text属性,它仍然存在。 -
@JasonVoorhees
System.Windows.Forms.MainMenu不继承自Control。我以为你在谈论Control实例。