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 屬性設定為 EnablePreventFocusChangeEnableAllowFocusChange 。 如果您取消 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

注意

如果您強制表單以這種方式關閉,表單控制項中尚未儲存的任何資料都會遺失。 此外,強制回應表單不會在控制項關閉時驗證控制項的內容。 您仍然可以使用控制項驗證來鎖定控制項的焦點,但不需要擔心關閉表單的相關行為。

另請參閱