我正在制作一个扩展方法库,用于在Windows窗体应用程序中使用。我打算创建的其中一个方法将使设置输入控件的错误状态变得更加容易,例如:
public static void SetError(this System.Windows.Forms.TextBox textBox, string errorMessage)
{
if (string.IsNullOrEmpty(errorMessage))
{
//reset control state
textBox.BackColor = System.Drawing.SystemColors.WindowText;
}
else
{
//set background colour to a nice shade of red
textBox.BackColor = System.Drawing.Color.MistyRose;
}
//try to locate an ErrorProvider on the control's containing form.
var errorProvider = LocateErrorProvider(textBox);
if (errorProvider != null)
{
//set error message on error provider (or clear it)
errorProvider.SetError(textBox, errorMessage);
}
}
我正在尝试弄清楚LocateErrorProvider
方法。我想做的是检查我的表单上是否存在一个ErrorProvider,如果存在则仅在其存在时使用它。
ErrorProvider是一个Component
而不是Control
,所以我不能通过form.Controls
属性访问它。我已经尝试将父表单转换为各种对象,但均无效。
更新:我已经使用以下代码反射方式获得了ErrorProvider:
private static System.Windows.Forms.ErrorProvider GetErrorProvider(System.Windows.Forms.Control control)
{
//get the containing form of the control
var form = control.GetContainerControl();
//use reflection to get to "components" field
var componentField = form.GetType().GetField("components", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);
if (componentField != null)
{
//get the component collection from field
var components = componentField.GetValue(form);
//locate the ErrorProvider within the collection
return (components as System.ComponentModel.IContainer).Components.OfType<System.Windows.Forms.ErrorProvider>().FirstOrDefault();
}
else
{
return null;
}
}
个人而言,我不太喜欢使用硬编码字段名来访问字段。但在这种情况下,它似乎可以很好地解决问题。有没有更好的方法来实现相同的结果?
System.Windows.Forms.Form
的集合,而是由Visual Studio添加到Form类的设计时变量。我尝试使用反射来获取该字段,并成功“瞥见”了ErrorProvider,但我还没有真正“获取”它。 - tobias86