2011-12-20 59 views
1

我一直在處理自定義文本框控件,它只允許字母數字字符。請注意,我沒有限制KeyPress,KeyUp事件中的字符,因爲我不想限制複製/粘貼或任何其他應該允許的操作。我只修剪了粘貼操作中的非字母數字字符。但是,我不確定我寫的代碼是好還是壞,因爲我對桌面應用程序的經驗很少。C#Winforms:有什麼方法可以改進這個簡單的自定義文本框代碼嗎?

using System; 
using System.Windows.Forms; 
using System.Text.RegularExpressions; 

namespace SaintThomas.UserControls 
{ 
    class TextBoxForUserName : TextBox 
    { 
     protected override void OnTextChanged(EventArgs e) 
     { 
      base.OnTextChanged(e); 

      this.SuspendLayout(); 
      int startPos = this.SelectionStart; 
      if (Regex.IsMatch(this.Text, "[^0-9_A-Z]", RegexOptions.IgnoreCase)) 
      { 
       int reduceStartPos = this.Text.Length; 
       this.Text = Regex.Replace(this.Text, "[^0-9_A-Z]", "", RegexOptions.IgnoreCase); 
       startPos = (startPos <= 0) ? 0 : startPos - (reduceStartPos - this.Text.Length); 
       if (this.Text.Length < startPos) 
       { 
        startPos = this.Text.Length; 
       } 
       this.SelectionStart = startPos; 
      } 
      this.ResumeLayout(); 
     } 
    } 
} 
+2

我認爲這將是更好的[代碼評論](http://codereview.stackexchange.com/) – V4Vendetta 2011-12-20 07:27:00

+0

嘿,Code Review是一個很好的主意。我可以直接將這篇文章轉換爲Code Review,還是需要重新發布? – 2011-12-20 10:17:11

回答

4

這樣做的最好方法是使用MaskedTextBox control

沒有理由重新發明車輪,當你不必這樣做。

+2

MaskedTextBox允許任意數量的字符,或只有固定的掩碼嗎?我認爲這是後者,這不是OP所期待的。 – 2011-12-20 07:38:02

+0

我完全同意但是可以允許在MaskedTextBox中沒有PromptChar屬性的可變長度字母數字字符? – 2011-12-20 09:29:35

0

乍一看,第一個if條件看起來完全沒有必要,因爲如果你將其忽略掉,代碼也會完全相同。

+0

是的。你是對的。我只是保留它,因爲我不想在正確輸入的情況下設置SelectionStart屬性。一旦我完成測試並確信它不會影響當前位置,我將刪除它。 – 2011-12-20 09:32:21

相關問題