如何驗證使用者輸入的概觀

當使用者將資料輸入您的應用程式時,您可以確認資料在應用程式使用之前是否有效。 您可能需要某些文字欄位的長度不為零、某欄位需格式為電話號碼,或是某些字串不能包含無效字元。 Windows Forms 可讓您透過數種方式來驗證應用程式中的輸入。

MaskedTextBox 控制項

如果您需要要求使用者以明確定義格式輸入資料,例如電話號碼或零件編號,您可以使用 MaskedTextBox 控制項,以少量程式碼快速完成。 遮罩是由遮罩語言中的字元組成的字串,用來指定在文字方塊中的任何指定位置可輸入哪些字元。 控制項會對使用者顯示一組提示。 如果使用者輸入錯誤,例如當需要輸入數字時卻輸入了字母,控件就會自動拒絕該項輸入。

MaskedTextBox 所使用的遮罩語言具有彈性。 其可讓您指定必要字元、選擇性字元、常值字元 (例如連字號和括弧)、貨幣字元,以及日期分隔符號。 控制項在繫結到資料來源時也能良好運作。 資料繫結中的 Format 事件可用來重新格式化傳入資料,使其符合遮罩,而 Parse 事件可用來重新格式化傳出資料,使其符合資料欄位的規格。

事件驅動驗證

如果您想要擁有驗證的完整程式設計控制權,或需要複雜的驗證檢查,您應該使用大部分 Windows Forms 控制項內建的驗證事件。 每個接受自由格式使用者輸入的控制項都有一個 Validating 事件,當控制項需要進行資料驗證時,該事件就會被觸發。 在事件處理程式程式代碼中 Validating ,您可以透過數種方式驗證用戶輸入。 例如,如果您有必須包含郵遞區號的文字輸入框,您可以透過下列方式進行驗證:

  • 如果郵遞區號必須屬於一組特定郵遞區號,您可以對輸入執行字串比較來驗證使用者輸入的資料。 例如,如果郵遞區號必須在集合 {10001, 10002, 10003} 中,則您可以使用字串比較來驗證資料。

  • 如果郵遞區號必須採用特定格式,您可以使用規則運算式來驗證使用者輸入的資料。 例如,若要驗證 ##########-#### 格式,您可以使用規則運算式 ^(\d{5})(-\d{4})?$。 若要驗證此格式 A#A #A#,您可以使用正則運算式 [A-Z]\d[A-Z] \d[A-Z]\d。 如需更多有關規則運算式的資訊,請參閱 .NET 規則運算式規則運算式範例

  • 如果郵遞區號必須是有效的美國郵遞區號,您可以呼叫郵遞區號 Web 服務來驗證使用者輸入的資料。

Validating 事件會提供一個 CancelEventArgs 類型的物件。 如果您判斷控制項的資料無效,請將此物件的 Cancel 屬性設為 true,以取消 Validating 事件。 如果您未設定 Cancel 屬性,Windows Forms 會假設該控件的驗證成功並引發 Validated 事件。

如需在 TextBox 中驗證電子郵件地址的程式碼範例,請參閱 Validating 事件參考。

事件驅動的驗證資料繫結控制項

當您將控制項繫結至資料來源 (例如資料庫資料表) 時,驗證會很有用。 藉由使用驗證,您可以確定控制項的資料滿足資料來源所需的格式,且不包含任何特殊字元,例如可能不安全的引號和反斜線。

當您使用資料繫結時,控制項中的資料會在執行 Validating 事件期間與資料來源同步。 如果您取消 Validating 事件,資料將不會與資料來源同步。

這很重要

如果您有在 Validating 事件之後進行的自訂驗證,也不會影響資料繫結。 例如,如果您在 Validated 事件中撰寫了嘗試取消資料繫結的程式碼,資料繫結仍然會發生。 在此情況下,若要在 Validated 事件中執行驗證,請將控制項的 Binding.DataSourceUpdateMode 屬性從 DataSourceUpdateMode.OnValidation 變更為 DataSourceUpdateMode.Never,並將 your-control.DataBindings["field-name"].WriteValue() 新增至驗證程式碼中。

隱含和明確驗證

那麼,何時會驗證控制項的資料? 這會由身為開發人員的您來決定。 您可以根據應用程式的需求,使用隱含或明確驗證。

隱含驗證

隱含驗證方法會在使用者輸入資料時驗證資料。 您可以透過讀取按下的按鍵來驗證資料,或 (更常見的情況是) 在每次使用者將輸入焦點從控制項移開時驗證資料。 如果您想在使用者操作時,立即提供有關資料的回饋,這種做法就很有用。

若要對某個控制項使用隱含驗證,您必須將該控制項的 AutoValidate 屬性設為 EnablePreventFocusChangeEnableAllowFocusChange。 如果您取消 Validating 事件,控制項的行為將取決於您指派給 AutoValidate 的值。 如果您已完成 EnablePreventFocusChange 指派,則取消事件會防止 Validated 事件發生。 在使用者將數據變更為有效格式之前,輸入焦點會維持在目前的控件上。 如果您指派了 EnableAllowFocusChange,當您取消該事件時,Validated 事件就不會發生,但焦點仍會移至下一個控制項。

Disable 指派給 AutoValidate 屬性會完全停用隱含驗證。 若要驗證控件,請使用明確驗證。

明確驗證

明確驗證方法會驗證資料一次。 您可以驗證資料來回應使用者動作 (例如按一下 [儲存] 按鈕或 [下一步] 連結)。 發生使用者動作時,您可以透過下列其中一種方式來觸發明確驗證:

  • 呼叫 Validate 來驗證最後一個失去焦點的控制項。
  • 呼叫 ValidateChildren 以驗證表單或容器控制項中的所有子控制項。
  • 呼叫自訂方法,以手動驗證控制項中的資料。

控制項的預設隱含驗證行為

不同的 Windows Forms 控制項,其 AutoValidate 屬性各有不同的預設值。 下表顯示最常見的控制項及其預設值。

管理 預設驗證行為
ContainerControl Inherit
Form EnableAllowFocusChange
PropertyGrid Visual Studio 中未公開的屬性
ToolStripContainer Visual Studio 中未公開的屬性
SplitContainer Inherit
UserControl EnableAllowFocusChange

關閉表單並覆寫驗證

當控制項因為其所包含的資料無效而維持焦點時,則無法透過下列平常方式之一來關閉父表單:

  • 按一下關閉按鈕。
  • 選取 系統>關閉 功能表。
  • 透過程式碼呼叫 Close 方法。

不過,在某些情況下,您可能想要讓使用者關閉表單,而不論控制項中的值是否有效。 您可以藉由為表單的 FormClosing 事件建立處理常式,略過驗證並關閉仍包含無效資料的表單。 在事件中,將 Cancel 屬性設為 false。 這會強制表單關閉。 如需更多資訊和範例,請參閱 Form.FormClosing

備註

如果您強制窗體以這種方式關閉,則會遺失未儲存的數據。 此外,模態表單在關閉時,不會驗證控制項的內容。 您仍然可以使用控制項驗證將焦點鎖定在控制項,但不需要擔心關閉表單的相關行為。

另請參閱