如何驗證使用者輸入的概觀(Windows Forms .NET)

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

重要

.NET 7 和 .NET 6 的桌面指南檔正在建置中。

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 屬性設定為 trueValidating 取消事件。 如果您未設定 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

注意

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

另請參閱