当我迭代表单上的一堆不同控件时,而不是尝试访问 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);
}
}
有没有办法只确定给定的控件是否has文本属性?像这样的事情:
String text = String.Empty;
foreach(Control control in this.Controls)
{
if(control has Text property)
{
text = control.Text;
}
}
我绝对鄙视 Try/Catch 块(当然,除非没有更好的选择)。
All Control
对象有一个Text财产 http://msdn.microsoft.com/en-us/library/system.windows.forms.control.text.aspx,因此使用反射来确定这一点是没有意义的。它总会回来true
.
你的问题实际上是一些控件抛出异常Text
财产,因为他们不支持它。
如果您还希望能够使用您事先不知道的自定义控件,则应该坚持使用当前的解决方案并捕获异常。但是,你应该抓住抛出的具体异常, 例如NotSupportedException
.
如果您只遇到预先知道的控件,则可以选择您知道有效的控件Text
财产。例如:
public static bool HasWorkingTextProperty(Control control)
{
return control is Label
|| control is TextBox
|| control is ComboBox;
}
var controlsWithText = from c in this.Controls
where HasWorkingTextProperty(c)
select c;
foreach(var control in controlsWithText)
{
string text = control.Text;
// Do something with it.
}
如果您实现自己的自定义控件,该控件可能有也可能没有Text
属性,那么您可以从指示这一点的基类派生它们:
public abstract class CustomControlBase : Control
{
public virtual bool HasText
{
get { return false; }
}
}
public class MyCustomControl : CustomControlBase
{
public override bool HasText
{
get { return true; }
}
public override string Text
{
get { /* Do something. */ }
set { /* Do something. */ }
}
}
public static bool HasWorkingTextProperty(Control control)
{
return (control is CustomControlBase && ((CustomControlBase)control).HasText)
|| control is Label
|| control is TextBox
|| control is ComboBox;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)