在 MFC 中,CEdit 可透過設定 ES_NUMBER 風格限制只接受數字輸入。但在 .NET 中,TextBox 沒有內建屬性或方法直接實現此功能。解決此問題有多種方案:
| 方案 | 說明 | 優點 | 缺點 |
|---|---|---|---|
| 繼承 TextBox 覆寫 CreateParams 加入 ES_NUMBER | 在 CreateParams 的 Style 加入 ES_NUMBER 標誌,利用 Windows 原生編輯控制項行為。 |
最省力,行為與原生一致。 | 無法處理貼上非數字字串;擴充性有限。 |
| 監聽 KeyDown 事件自行驗證 | 在 KeyDown 中攔截非數字按鍵。 |
可自訂規則(如允許負數、十六進位)。 | 無法攔截貼上操作;需自行處理邊界情況。 |
| 使用第三方 TextBox 衍生控制項 | 採用社群成熟元件,如 CodeProject 上的 NumericTextBox、AlphanumericTextBox 等。 |
功能完善,節省開發時間。 | 引入外部依賴;需評估授權與維護狀態。 |
| 使用 MaskedTextBox | 設定 Mask 屬性定義輸入格式(如 "999,999.00")。 |
內建格式化、提示字元、驗證事件;設計師支援完整。 | 輸入體驗與純 TextBox 不同;遮罩字元固定顯示。 |
| 使用 NumericUpDown | 改用內建數值調整控制項,含上下按鈕、範圍限制、千分位分隔。 | 最直接的數值輸入方案;功能豐富、無需驗證邏輯。 | 外觀與 TextBox 差異大;不適用需自由文本編輯的場景。 |
ES_NUMBER 最快。MaskedTextBox 或 NumericUpDown 更適合。