2012-11-01 36 views
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 
       } 
      } 
     } 

任何人都可以點我在正確的方向,或者是一個更好的辦法,我可以做到這一點。我期望這些控制將會有很多形式,所以我想盡可能地從父表單中進行分組驗證。

感謝,

+0

您創建了這些自定義控件嗎? –

+0

是的。基本上自定義文本框使用正則表達式來驗證自己取決於在設計時選擇了什麼。 – Simon

+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

爲了節省鑄造兩次,做一個'as'投射並檢查null:'IValidate validateControl = c as IValidate; if(validateControl!= null)'。 –

+0

完美。我真的應該養成使用接口的習慣! – Simon

+0

@Simon是的,你應該,但是在這個例子中,只是意識到以不同的方式對標準的WinForms控件進行驗證! –

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

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

相關問題