在各种用户控件上调用方法

时间:2012-11-01 10:32:07

标签: c# winforms user-controls

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

任何人都可以指出我正确的方向,或者更好的方式我可以做到这一点。我希望这些控件有很多形式,所以我想从父表单中尽可能简单地进行分组验证。

谢谢,

3 个答案:

答案 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();
  }