Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在各种用户控件上调用方法_C#_Winforms_User Controls - Fatal编程技术网

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

C# 在各种用户控件上调用方法,c#,winforms,user-controls,C#,Winforms,User Controls,我在应用程序中创建了许多自定义用户控件。它们是使用Validates()方法验证自己内容的控件。当我单击表单上的按钮时,我想在任何具有该方法的控件上调用该方法。实现这一目标的最佳方式是什么 我能够识别和控制,并检查它们是否有方法,但不确定此时如何调用它。(所有控件均以“cc”开头) 有人能给我指出正确的方向吗,或者我能用一种更好的方法。我希望这些控件将出现在许多表单上,因此我希望从父表单中尽可能轻松地进行分组验证 谢谢,您应该创建一个接口,每个具有验证方法的控件都应该实现该接口 public i

我在应用程序中创建了许多自定义用户控件。它们是使用Validates()方法验证自己内容的控件。当我单击表单上的按钮时,我想在任何具有该方法的控件上调用该方法。实现这一目标的最佳方式是什么

我能够识别和控制,并检查它们是否有方法,但不确定此时如何调用它。(所有控件均以“cc”开头)

有人能给我指出正确的方向吗,或者我能用一种更好的方法。我希望这些控件将出现在许多表单上,因此我希望从父表单中尽可能轻松地进行分组验证


谢谢,

您应该创建一个
接口
,每个具有
验证
方法的控件都应该实现该接口

public interface IValidatable
{
    void Validates();
}
并检查循环中的接口

foreach (Control c in this.Controls)
{
  IValidatable validateControl = c as IValidatable;
  if(validateControl != null)
  {

       // do the validation.
       validateControl.Validates();
  }

也许尝试使用一个接口

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

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

这些是您创建的自定义控件吗?是的。基本上是自定义的文本框,根据设计时选择的内容使用正则表达式进行自我验证。好的,请参阅我关于表单验证事件的回答要保存强制转换两次,请执行
as
强制转换并检查null:
IValidate validateControl=c as IValidate;如果(validateControl!=null)
.Perfect。我真的应该养成使用界面的习惯@Simon是的,但是在本例中,您应该注意以与标准WinForms控件不同的方式进行验证@特雷弗·皮利:谢谢特雷弗,我把它带上了船。目前,此解决方案将满足我的需要,但为了将来,我将研究基于事件的验证
foreach (Control c in this.Controls)
{
    if ( c is IValidateMyData )
    {
        var validationResult = (c as IValidateMyData).Validate();
    }
}