validating事件發生的時候,值還沒有被真正存入,所以是空的,而validated事件發生的時候,值已經存入,所以能取出;一個相當於值的前因,一個相當於值的後果。也就是說,可以用validating事件在值存入之前檢驗某個先決條件,如果不滿足,那麼取消之前的操作,用e.cancel;如果要檢驗值本身的合法性,那麼就用validated事件在值存入之後得到該欄位的值。這也是為什麼validated事件的e參數沒有cancel的原因,因為這個時候值已經存入,動作已經完成,無法取消。
另外還有一點,不管是validating還是validated,事件發生的時候控制項都沒有失去焦點,所以才能談得上對該控制項進行操作。控制項的事件發生順序為Enter、GotFocus、Leave、Validating、Validated、LoseFocus,也就是說程式焦點先“進入”控制項,然後控制項“得到焦點”,然後焦點“離開”控制項,這個時候焦點在控制項內乾的事情還沒有存入,於是“校正”,然後存入,存入完了發生“校正完”事件,善後處理完畢後控制項就“失去焦點”。
您可能經常需要檢查使用者輸入到 Windows 表單中的資訊是否有效。例如,如果您有一個電話號碼的 TextBox 控制項,則可以檢查該控制項是否只包含適當的字元(數字、括弧和連字號等等)。通常,可使用Regex驗證使用者輸入的資料。 瞭解Validating之前,我們還需要瞭解焦時間點事件的順序: 焦時間點事件按下列順序發生: Enter //進入控制項時發生 GotFocus //在控制項接收焦點時發生 Leave //輸入焦點離開控制項時發生 Validating //控制項資料效驗時發生 Validated //資料效驗完成後發生 LostFocus //失去焦點時發生如果 CausesValidation 屬性設定為 false,則將取消 Validating 和 Validated 事件。 注:GotFocus 和 LostFocus 事件是關聯於 WM_KILLFOCUS 和 WM_SETFOCUS Windows 訊息的低層級焦時間點事件。應對所有控制項使用 Enter 和 Leave 事件。 如果在 Validating 事件委託中,CancelEventArgs 對象的 Cancel 屬性設定為 true,則正常情況下將在 Validating 事件之後發生的所有事件均被取消。 在操作中驗證 要驗證控制項的內容,可以編寫代碼來處理 Validating 事件。在事件處理常式中,測試特定的條件(例如上面的電話號碼)。驗證是在處理時發生的一系列事件之一。 如果測試失敗,則 Validating 事件的CancelEventArgs 的Cancel 屬性將設定為 True。這將取消 Validating 事件,並導致焦點返回到控制項(juky_huang注:這樣會出現一個死迴圈,除非資料效驗通過,可以使用下面強制方法來關閉)。實際的結果是,除非資料有效,否則使用者將無法退出該控制項。 關閉表單和重寫驗證 當資料無效時,維護焦點的控制項的副作用是,使用關閉表單的任何常規方法都將無法關閉父表單: 單擊“關閉”框 通過右擊標題列顯示的“系統”菜單 以編程方式調用 Close 方法 不過,在某些情況下,無論控制項中的值是否有效,您都希望使用者可以關閉表單。您可以重寫驗證,並通過建立表單的Closing 事件的處理常式來關閉仍包含無效資料的表單。在該事件中,將 Cancel 屬性設定為 False。這將強制關閉該表單。 注意 如果使用此方法強制關閉表單,控制項中尚未儲存的任何資訊都將丟失。 注意 模式表單在關閉時不會驗證控制項內容。您仍可以使用控制項驗證將焦點鎖定到控制項,但不必考慮關閉表單的行為。 Validating事件是在使用者改變某個控制項的某項值時激發的,比如改變TextBox的Text。通常,要激發Validating需要設CausesValidation屬性為true。 你可以在Validating事件裡面檢查改變的值是否合法。 例如你規定TextBox的Text只能輸入ABC三個字母中的某一個或幾個,當使用者輸入或改變時就會激發Validating事件,你可以在Validating事件的委託裡面檢查TextBox.Text是不是僅僅由ABC三個字母中的某一個或幾個構成。 如果是,可以什麼都不做就退出該過程;如果不是,你只要執行這一句: e.Cancel = True 就可以取消操作