0

我在我的应用程序中创建了许多自定义用户控件。它们是使用 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
                }
            }
        }

谁能指出我正确的方向,或者我可以用更好的方法来做到这一点。我希望这些控件将出现在很多表单上,所以我想从父表单中尽可能简单地进行分组验证。

谢谢,

4

3 回答 3

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()”方法。

于 2012-11-01T10:38:56.727 回答
1

在 WinForms 中执行此操作的常用方法是使用表单验证事件。

于 2012-11-01T10:39:39.510 回答
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();
  }
于 2012-11-01T10:34:30.387 回答