2017-06-02 31 views
0

我正在創建一個項目,該項目將包含三種形式,一種父表單,它將成爲要加載的表單的決定器。由於兩個孩子的形式稍微相似,許多驗證是相同的。我有我的驗證方法,然後在Validating event中調用,我怎樣才能最大限度地減少Validating events中的重複數量,並且只有一個方法帶有一個驗證事件,該事件控制了我共享該方法的所有控件。如何避免驗證事件的重複Winforms

這是我的方法的一個例子,多數民衆贊成在整個廣泛應用於:

public bool numValidation(string strNum)  
{ 
    if (!string.IsNullOrWhiteSpace(strNum)) 
    { 
     int temp; 
     if (int.TryParse(strNum, out temp)) 
     { 
      MessageBox.Show("Phone Number is a valid input: " + temp); 
      return true; 
     } 
     else 
     { 
      MessageBox.Show(temp + "Is not Valid input!!");        
     }   
    } 

    return false; 
} 

而這僅僅是我的許多驗證事件之一:

private void txt_LndLine_Validating(object sender, CancelEventArgs e) 
{ 
    numValidation(txt_LndLine.Text); 
    txt_LndLine.Clear(); 
} 

上我怎麼可能真的很奇怪的想法清理代碼並儘量減少重複。在此先感謝:)

+1

創建庫項目,並存儲在一個靜態實用類此的常用方法。不要把UI元素和邏輯放在這個庫中。只需返回true/false,讓UI部分顯示消息 – Steve

+0

Thanks @Steve因此,只需創建靜態utill類,並將所有在那裏驗證的方法。然後通過創建該類的實例並調用方法來調用它們?或者我應該無處? – whatdoyouNeedFromMe

+1

或多或少。首先,你不要把所有東西都放在那裏,而只需要可以重用的通用代碼,而不需要邏輯上與某些類相關聯。其次,如果您的類或方法是靜態的,則不需要創建實例。 (IE爲名爲Utility的類使用名爲numValidation的靜態方法,您可以調用_Utility.numValidation(.....)_ – Steve

回答

2

如果你有很多常見的東西,聲明性驗證可以幫助你清理你的代碼。

MSDN - Extending Windows Forms with a Custom Validation Component Library

你也可以處理多個控制驗證事件與同分,使用輔助類重用驗證計算功能。

最後但並非最不重要的是,閱讀關於IDataErrorInfo。有了這個接口,你可以把所有的驗證算法放到你的商務課上。

它是在工作的WinForms細跟ErrorProvider控件和數據綁定

+0

感謝評論現在看一看,乾杯 – whatdoyouNeedFromMe

0

感謝@Steve解決,更好的代碼。通過創建一個獨立的靜態類,並在兩個頁面中的所有Validating Events中簡單調用具有常用功能的方法來解決這個問題。

private void txt_Fax_Validating(object sender, CancelEventArgs e) 
     { 
      Utillity.numValidation(txt_Fax.Text); 
      txt_Fax.Clear(); 

     } 

而且Utillity類如下:

public static bool numValidation(string strNum) 
    { 
     if (!string.IsNullOrWhiteSpace(strNum)) 
     { 
      int temp; 
      if (int.TryParse(strNum, out temp)) 
      { 
       Console.WriteLine("Phone Number is a valid input: " + temp); 
       return true; 
      } 
      else 
      { Console.WriteLine(temp + "Is not Valid input!!"); } 
     } 
     return false; 
    }