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