C#中Validating和Validated事件


您可能經常需要檢查用戶輸入到 Windows 窗體中的信息是否有效。例如,如果您有一個電話號碼的 TextBox 控件,則可以檢查該控件是否只包含適當的字符(數字、括號和連字符等等)。通常,可使用正則表達式驗證用戶輸入的數據。

了解Validating之前,我們還需要了解焦點事件的順序:

焦點事件按下列順序發生:

  1. Enter   //進入控件時發生
  2. GotFocus   //在控件接收焦點時發生
  3. Leave   //輸入焦點離開控件時發生
  4. Validating   //控件數據效驗時發生
  5. Validated  //數據效驗完成后發生
  6. LostFocus  //失去焦點時發生

如果 CausesValidation 屬性設置為 false,則將取消 ValidatingValidated 事件。

注:GotFocusLostFocus 事件是關聯於 WM_KILLFOCUS 和 WM_SETFOCUS Windows 消息的低級別焦點事件。應對所有控件使用 EnterLeave 事件。

如果在 Validating 事件委托中,CancelEventArgs 對象的 Cancel 屬性設置為 true,則正常情況下將在 Validating 事件之后發生的所有事件均被取消。

在操作中驗證

要驗證控件的內容,可以編寫代碼來處理 Validating 事件。在事件處理程序中,測試特定的條件(例如上面的電話號碼)。驗證是在處理時發生的一系列事件之一。

如果測試失敗,則 Validating 事件的 CancelEventArgs 的 Cancel 屬性將設置為 True。這將取消 Validating 事件,並導致焦點返回到控件(juky_huang注:這樣會出現一個死循環,除非數據效驗通過,可以使用下面強制方法來關閉)。實際的結果是,除非數據有效,否則用戶將無法退出該控件。

關閉窗體和重寫驗證

當數據無效時,維護焦點的控件的副作用是,使用關閉窗體的任何常規方法都將無法關閉父窗體:

  • 單擊“關閉”框
  • 通過右擊標題欄顯示的“系統”菜單
  • 以編程方式調用     Close 方法

不過,在某些情況下,無論控件中的值是否有效,您都希望用戶可以關閉窗體。您可以重寫驗證,並通過創建窗體的 Closing 事件的處理程序來關閉仍包含無效數據的窗體。在該事件中,將 Cancel 屬性設置為 False。這將強制關閉該窗體。

注意   如果使用此方法強制關閉窗體,控件中尚未保存的任何信息都將丟失。

注意   模式窗體在關閉時不會驗證控件內容。您仍可以使用控件驗證將焦點鎖定到控件,但不必考慮關閉窗體的行為。

 

 

        public bool ValidEmailAddress(string emailAddress, out string errorMessage)
        {
            //首先判斷是否為空,然后判斷是否有@,.符號
            if (emailAddress.Length == 0)
            {
                errorMessage = "e-mail address is required.";
                return false;
            }
            //是否包含@
            if (emailAddress.IndexOf("@") > -1)
            {
                //從@往后面開始搜索,找到.的位置,如果位置大於@的位置說明格式正確
                if (emailAddress.IndexOf(".", emailAddress.IndexOf("@")) > emailAddress.IndexOf("@"))
                {
                    errorMessage = "";
                    return true;
                }
            }

            errorMessage = "e-mail address must be valid e-mail address format./n" + "For example 'someone@example.com'";
            return false;
        }

        private void textBox4_Validating(object sender, CancelEventArgs e)
        {
            //email地址
            string errorMsg;
            bool flag = ValidEmailAddress(((TextBox)sender).Text, out errorMsg);

            if (!flag)
            {
                e.Cancel = true;
                this.textBox1.Select(0, this.textBox4.Text.Length);
                this.errorProvider1.SetError(this.textBox4, errorMsg);

            }


        }

        private void textBox4_Validated(object sender, EventArgs e)
        {
            errorProvider1.SetError(this.textBox4, "");
        }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM