Windows Form 中的使用者輸入驗證
當使用者將資料輸入您的應用程式時,您可能想要確認資料在應用程式使用之前是否有效。 您可能需要某些文字欄位不是零長度、將欄位格式化為電話號碼或其他格式正確的資料類型,或是字串不包含任何可能用來危害資料庫安全性的不安全字元。 Windows Forms 提供數種方式,讓您驗證應用程式中的輸入。
使用 MaskedTextBox 控制項進行驗證
如果您需要要求使用者以定義完善的格式輸入資料,例如電話號碼或部分號碼,您可以使用 控制項快速且最少的程式碼 MaskedTextBox 來完成此作業。 遮罩 是由遮罩語言字元組成的字串,指定可以在文字方塊中的任何指定位置輸入哪些字元。 控制項會顯示一組提示給使用者。 例如,如果使用者輸入不正確的專案,當使用者輸入數位時輸入字母,控制項會自動拒絕輸入。
所使用的 MaskedTextBox 遮罩語言非常有彈性。 它可讓您指定必要的字元、選擇性字元、常值字元,例如連字號和括弧、貨幣字元和日期分隔符號。 系結至資料來源時,控制項也運作良好。 Format資料系結上的事件可用來重新格式化傳入資料以符合遮罩,而 Parse 事件可用來重新格式化傳出資料,以符合資料欄位的規格。
如需詳細資訊,請參閱 MaskedTextBox 控制項 。
事件驅動驗證
如果您想要完整以程式設計方式控制驗證,或需要執行複雜的驗證檢查,您應該使用大部分 Windows Forms 控制項內建的驗證事件。 每個接受自由格式使用者輸入的控制項都有一個 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 Forms 會假設該控制項的驗證成功,並引發 Validated 事件。
如需驗證 中 TextBox 電子郵件地址的程式碼範例,請參閱 Validating 。
資料系結和事件驅動驗證
當您將控制項系結至資料來源時,驗證非常有用,例如資料庫資料表。 藉由使用驗證,您可以確定控制項的資料符合資料來源所需的格式,而且它不包含任何特殊字元,例如引號和可能不安全的反斜線。
當您使用資料系結時,控制項中的資料會在事件執行 Validating 期間與資料來源同步處理。 如果您取消 Validating 事件,資料將不會與資料來源同步處理。
重要
如果您有在事件之後 Validating 發生的自訂驗證,則不會影響資料系結。 例如,如果您在嘗試取消資料系結的事件中有 Validated 程式碼,則資料系結仍會發生。 在此情況下,若要在 事件中 Validated 執行驗證,請將控制項的 [資料來源更新模式 ] 屬性 ( 在 [Databindings] \ [進階] 下)從 OnValidation 變更為 [永不 ],並將 Control .DataBindings["
< YOURFIELD >"].WriteValue()
新增 至您的驗證程式代碼。
隱含和明確驗證
那麼,何時會驗證控制項的資料? 這是由開發人員決定的。 視應用程式的需求而定,您可以使用隱含或明確驗證。
隱含驗證
隱含驗證方法會在使用者輸入資料時驗證資料。 您可以藉由在按下按鍵時讀取按鍵,或當使用者將輸入焦點從某個控制項移開並移至下一個控制項時,來驗證資料。 當您想要在資料運作時立即就資料提供意見反應時,此方法很有用。
如果您想要對控制項使用隱含驗證,必須將該控制項的 AutoValidate 屬性設定為 EnablePreventFocusChange 或 EnableAllowFocusChange 。 如果您取消 Validating 事件,控制項的行為將取決於您指派給 AutoValidate 的值。 如果您已 EnablePreventFocusChange 指派 ,取消事件將會導致 Validated 事件不會發生。 在使用者將資料變更為有效的輸入之前,輸入焦點會維持在目前的控制項上。 如果您已 EnableAllowFocusChange 指派 , Validated 則不會在取消事件時發生事件,但焦點仍會變更為下一個控制項。
Disable指派給 AutoValidate 屬性會完全防止隱含驗證。 若要驗證控制項,您必須使用明確的驗證。
明確驗證
明確驗證方法會一次驗證資料。 您可以驗證資料以回應使用者動作,例如按一下 [儲存] 按鈕或 [下一步] 連結。 發生使用者動作時,您可以透過下列其中一種方式觸發明確驗證:
呼叫 Validate 以驗證最後一個控制項失去焦點。
呼叫 ValidateChildren 以驗證表單或容器控制項中的所有子控制項。
呼叫自訂方法,以手動驗證控制項中的資料。
Windows Forms 控制項的預設隱含驗證行為
不同的 Windows Forms 控制項對於其 AutoValidate 屬性有不同的預設值。 下表顯示最常見的控制項及其預設值。
控制 | 預設驗證行為 |
---|---|
ContainerControl | Inherit |
Form | EnableAllowFocusChange |
PropertyGrid | Visual Studio 中未公開的屬性 |
ToolStripContainer | Visual Studio 中未公開的屬性 |
SplitContainer | Inherit |
UserControl | EnableAllowFocusChange |
關閉表單並覆寫驗證
當控制項因為包含的資料無效而維持焦點時,不可能以其中一般方式關閉父表單:
按一下 [ 關閉] 按鈕。
選取 [系統 ] 功能表中的 [ 關閉 ]。
以程式設計方式呼叫 Close 方法。
不過,在某些情況下,您可能會想要讓使用者關閉表單,而不論控制項中的值是否有效。 您可以建立表單事件的 FormClosing 處理常式,覆寫驗證並關閉仍然包含無效資料的表單。 在 事件中,將 Cancel 屬性設定為 false
。 這會強制關閉表單。 如需詳細資訊和範例,請參閱 Form.FormClosing。
注意
如果您強制表單以這種方式關閉,表單控制項中尚未儲存的任何資料都會遺失。 此外,強制回應表單不會在控制項關閉時驗證控制項的內容。 您仍然可以使用控制項驗證來鎖定控制項的焦點,但不需要擔心關閉表單的相關行為。
另請參閱
意見反應
https://aka.ms/ContentUserFeedback。
即將登場:在 2024 年,我們將逐步淘汰 GitHub 問題作為內容的意見反應機制,並將它取代為新的意見反應系統。 如需詳細資訊,請參閱:提交並檢視相關的意見反應