Windows Form 中的使用者輸入驗證
更新:2007 年 11 月
當使用者將資料輸入應用程式時,您可能會想要在應用程式使用資料之前,先驗證資料是否有效。您可能會要求某些文字欄位長度不得為零、某個欄位的格式需為電話號碼或其他語式正確 (Well-Formed) 之資料型別,或是某個字串不得包含任何會危害資料庫安全性的不安全字元。Windows Form 提供幾種方法讓您驗證應用程式的輸入。
MaskedTextBox 控制項的驗證
如果您需要使用者以妥善定義的格式輸入資料 (例如電話號碼或零件編號),您可以使用 MaskedTextBox 控制項,以最少的程式碼快速完成這項工作。「遮罩」(Mask) 是指由遮罩語言的字元所組成的字串,這種語言會指定哪些字元可以輸入至文字方塊中的任何指定位置。控制項會對使用者顯示一組提示。如果使用者輸入不正確的項目 (例如在需要數字時使用者輸入字母),則控制項會自動拒絕輸入。
MaskedTextBox 所使用的遮罩語言非常有彈性。可以讓您指定所需的字元、選擇性字元、常值字元 (例如短破折號和括號)、貨幣字元和日期分隔符號。此控制項也可以在繫結至資料來源時順利運作。資料繫結上的 Format 事件可以用來重新格式化輸入的資料以符合遮罩,而 Parse 事件則可以用來重新格式化傳出的資料,以符合資料欄位的規格。
如需詳細資訊,請參閱 MaskedTextBox 控制項 (Windows Form)。
事件驅動驗證
如果您想對驗證進行完整的程式設計控制,或需要執行複雜的驗證檢查,您應該使用建置在大部分 Windows Form 控制項中的驗證事件。接受自由格式的使用者輸入的每個控制項都有一個 Validating 事件,這個事件會在每次控制項需要資料驗證時發生。在 Validating 事件處理方法中,您可以使用幾種方法驗證使用者輸入。例如,如果文字方塊必須包含郵遞區號,您可以使用下列方式執行驗證:
如果郵遞區號必須屬於特定群組的郵遞區號代碼,您可以對輸入執行字串比較,以驗證使用者輸入的資料。例如,如果郵遞區號必須在 {10001, 10002, 10003} 集合中,您就可以使用字串比較驗證資料。
如果郵遞區號必須使用特定格式,您可以使用規則運算式驗證使用者輸入的資料。 例如,若要驗證 ##### 或 #####-#### 格式,您可以使用 ^(\d{5})(-\d{4})?$ 規則運算式。若要驗證 A#A #A# 格式,您可以使用 [A-Z]\d[A-Z] \d[A-Z]\d 規則運算式。如需規則運算式的詳細資訊,請參閱 .NET Framework 規則運算式和規則運算式範例。
如果郵遞區號必須是有效的美國郵遞區號代碼,您可以呼叫郵遞區號代碼 Web 服務,以驗證使用者輸入的資料。
Validating 事件具有一個 CancelEventArgs 型別的物件。如果您判斷控制項的資料是無效的,可以將這個物件的 Cancel 屬性設定為 true,取消 Validating 事件。如果您不設定 Cancel 屬性,Windows Form 會假設該控制項的驗證成功,並引發 Validated 事件。
如需在 TextBox 中驗證電子郵件位址的程式碼範例,請參閱 Validating。
資料繫結和事件驅動驗證
當您將控制項繫結至資料來源 (例如資料表) 時,驗證會非常有用。您可以藉由使用驗證,確定控制項的資料符合資料來源所要求的格式,並且未包含任何特殊字元,例如可能不安全的引號和反斜線。
當您使用資料繫結時,控制項中的資料會在執行 Validating 事件時與資料來源同步。如果您取消 Validating 事件,資料將不會與資料來源進行同步。
重要事項: |
---|
如果在 Validating 事件後執行自訂驗證,它並不會影響資料繫結。例如,如果在 Validated 事件中有嘗試取消資料繫結的程式碼,則資料繫結仍然會發生。在上述情形中,若要在 Validated 事件中執行驗證,請將控制項的 [資料來源更新模式] 屬性 (在 [(資料繫結)]\[(進階)] 中) 從 [OnValidation] 變更為 [Never],並且將 Control.DataBindings["<YOURFIELD>"].WriteValue() 加入驗證程式碼。 |
隱含和明確驗證
何時會驗證控制項的資料?這個問題必須由開發人員決定。您可以依據應用程式的需要,使用隱含或明確驗證。
隱含驗證
隱含驗證方法會在使用者輸入資料時進行驗證。您可以在資料輸入控制項時,藉由讀取使用者按下的鍵來進行驗證,或是更常見的做法是,在使用者將輸入焦點從某個控制項移到下一個控制項時進行驗證。當您想要對使用者正在處理的資料提供立即性回應時,這個方法就很有用。
如果您想要使用控制項的隱含驗證,就必須將該控制項的 AutoValidate 屬性設定為 true。如果您取消 Validating 事件,則會由指派給 AutoValidate 的值來判斷控制項的行為。如果您指派了 EnablePreventFocusChange,取消事件將造成 Validated 事件不會發生。除非使用者將資料變更為有效的輸入,否則輸入焦點會保持在目前的控制項上。如果您指派了 EnableAllowFocusChange,當取消事件時就不會發生 Validated 事件,但是焦點仍然會變更到下一個控制項。
將 Disable 指派給 AutoValidate 屬性會阻止所有隱含驗證。若要驗證控制項,您必須使用明確驗證。
明確驗證
明確驗證方法會驗證資料一次。您可以在使用者動作的回應中驗證資料,例如按一下 [儲存] 按鈕或 [下一步] 連結。當發生使用者動作時,您可以使用下列其中一種方法觸發明確驗證:
呼叫 Validate,驗證最後一個控制項是否失去焦點。
呼叫 ValidateChildren,驗證表單或容器控制項中所有的子控制項。
呼叫自訂方法,手動驗證控制項中的資料。
Windows Form 控制項的預設隱含驗證行為
不同的 Windows Form 控制項對於 AutoValidate 屬性都有不同的預設值。下表顯示最常見的控制項及其預設值。
控制項 |
預設驗證行為 |
---|---|
未在 Visual Studio 中公開的屬性 |
|
未在 Visual Studio 中公開的屬性 |
|
關閉表單和覆寫驗證
當控制項所包含的資料無效而導致保留了焦點時,可以使用其中一種常用方法關閉父表單:
按一下 [關閉] 按鈕。
在 [系統] 功能表中選取 [關閉]。
以程式設計方式呼叫 Close 方法。
但是在某些情況下,無論控制項中的值是否有效,您可能想要讓使用者能夠關閉表單。您可以為表單的 Closing 事件建立處理常式,以覆寫驗證,並關閉仍包含無效資料的表單。在事件中,將 Cancel 屬性設定為 false。如此會強制表單關閉。如需詳細資料和範例,請參閱 Form.Closing。
注意事項: |
---|
如果您使用這種方法強制關閉表單,表單控制項中尚未儲存的任何資料都會遺失。此外,強制回應表單在關閉時並不會驗證控制項的內容。您仍然可以使用控制項驗證將焦點鎖定在控制項中,但不需要考慮與關閉表單有關的行為。 |
請參閱
參考
System.ComponentModel.CancelEventArgs