在MFC裡需要獲取文本輸入時,經常會用到CEdit或者它的子類。可以通過設置它的Edit Control Styles來控制Edit控件的一些行為,例如說設置ES_NUMBER標識使控件只允許接受數字(雖然可以復制-粘貼非數字字符串到這個控件中)。
在.Net中,用於獲取文本輸入的控件是TextBox,但TextBox本身並不包含可以直接調用的方法或屬性來將其設置為只接受數字輸入。這個問題有好幾種方法來解決:
繼承TextBox並覆蓋其CreateParams屬性,對該屬性的Style成員添加ES_NUMBER標識;這個方法與MFC中用Edit Control Styles來初始化CEdit一樣。可以說是最偷懶的方法。
自行監聽TextBox的KeyDown事件,實現輸入驗證(但不保證復制-粘貼輸入的正確性);其實設置ES_NUMBER做的也是這件事,如果要實現的功能與Windows控件中默認的一樣的話沒必要自己監聽KeyDown事件;如果需要些額外的功能,例如說允許輸入負數、十六進制數等默認沒有的功能時,則監聽KeyDown事件是個有效的方式。
使用第三方編寫的繼承自TextBox的控件;這是擁有“不重復發明輪子”精神的人們的做法。既然獲取數字輸入應該是個常見問題,之前也肯定有人解決過,那麼利用別人的解決方案就行。
光是CodeProject上就有好幾個與這個相關的實現:
Validating Edit Controls。包括了NumericTextBox、AlphanumericTextBox、DateTextBox等許多版本的TextBox子類。值得一看。
A numeric textbox with a twist。
Numeric TextBox : Allow your users to enter numeric data the easy way。
使用MaskedTextBox 控件;這是.Net Framework自帶的一個TextBox的子類,實現了一個帶過濾功能的TextBox,可以自定義接受的輸入內容的格式。只要設置其string Mask屬性即可。如果覺得ES_NUMBER的功能不夠用,而自行監聽KeyDown事件來做驗證不夠優雅的話,這個MaskedTextBox絕對是值得考慮的選擇。例如說,要接受0到999999的數字,只要把Mask屬性設為"999,999.00"就行(意味著六位的可選十進制數字,一個小數點,和兩位必須輸入的小數)。MSDN上對這個控件有個簡單的walkthrough。
使用NumericUpDown控件。當需要獲取簡單數字輸入時,在.Net世界中最直接的方法不是去想辦法與TextBox搏斗,而應該換個控件來用——NumericUpDown。這個控件不但能接受來自鍵盤的數字輸入,還有一組上下箭頭來步進。它包含了許多可以設置的屬性,例如顯示分隔符逗號的bool ThousandsSeparator、控制最小/最大值的decimal Minimum/decimal Maximum屬性等。