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] 變更為 [永不],並將 [控制項].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

注意

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

另請參閱