我在我的应用程序中创建了许多自定义用户控件。它们是使用Validates()方法验证自己内容的控件。当我单击表单上的一个按钮时,我想在任何具有该方法的控件上调用此方法。实现这一目标的最佳方法是什么?
我能够识别和控制并检查他们是否有方法,但不确定如何在此时调用它。 (所有控件都以'cc'开头)
foreach (Control c in this.Controls)
{
if (c.Name.Length > 2 && c.Name.Substring(0, 2).Equals("cc"))
{
var type = c.GetType();
if (type.GetMethod("Validates") != null)
{
// Call method here
}
}
}
任何人都可以指出我正确的方向,或者更好的方式我可以做到这一点。我希望这些控件有很多形式,所以我想从父表单中尽可能简单地进行分组验证。
谢谢,
答案 0 :(得分:1)
也许尝试使用界面
public interface IValidateMyData
{
bool Validate();
}
public class ValidationControl : Control, IValidateMyData
{
// code here
public bool Validate()
{
return true;
}
}
在您的表单中迭代所有控件,但不检查名称,但确定控件是否实现了IValidateMyData接口:
foreach (Control c in this.Controls)
{
if ( c is IValidateMyData )
{
var validationResult = (c as IValidateMyData).Validate();
}
}
使用此方法,您的控件不一定具有特定的名称前缀。
此外,您可以将迭代遍历所有控件,将验证移动到表单继承的基类,并在表单中调用“ValidateAllControls()”方法。
答案 1 :(得分:1)
在WinForms中执行此操作的常用方法是使用Form Validating事件。
答案 2 :(得分:0)
您应该创建interface
,并且每个具有Validate
方法的控件都应该实现该接口。
public interface IValidatable
{
void Validates();
}
并检查循环中的界面。
foreach (Control c in this.Controls)
{
IValidatable validateControl = c as IValidatable;
if(validateControl != null)
{
// do the validation.
validateControl.Validates();
}