2011-04-21 53 views
0

我正在使用c#winform。如何驗證文本框的陣列

我有2維文本框數組我只希望他們只接受來自A-I的信件我創建了該方法,但僅適用於一個文本框。

這裏是我的代碼:

textbox[i,j].Validated+=new EventHandler(TextBox_KeyPress); 

private void TextBox_KeyPress(object sender, EventArgs e) 
{ 
    bool bTest = txtRegExStringIsValid(textbox[1,1].Text.ToString()); 
    ToolTip tip = new ToolTip(); 
     if (bTest == false) 
    { 

     tip.Show("Only A-I", textbox[1,1], 2000); 
     textbox[1,1].Text = " "; 
    } 
} 

private bool txtRegExStringIsValid(string textToValidate) 
{ 
    Regex TheRegExpression; 
    string TheTextToValidate; 
    string TheRegExTest = @"^[A-I ]+$"; 
    TheTextToValidate = textToValidate; 
    TheRegExpression = new Regex(TheRegExTest); 

    if (TheRegExpression.IsMatch(TheTextToValidate)) 
    { 
     return true; 
    } 
    else 
    { 
     return false; 
    } 
} 

任何人都可以請指導我應該怎麼辦讓這段代碼工作的所有文本框?

+0

爲什麼你已經註冊了'KeyPress'事件處理方法的處理程序中'Validated'事件?這兩個處理程序方法中的邏輯應該非常不同。 – 2011-04-21 11:02:15

+0

我是初學者請指導我如何做到這一點? – Aenu 2011-04-21 11:07:31

+0

使用兩個不同的事件處理程序。我不知道你在做什麼,所以很難提出更詳細的建議。每次按鍵時應該做什麼驗證,而用戶完成*驗證時應該進行驗證*輸入文本? – 2011-04-21 11:08:30

回答

1

我想文本框接受AI只有字母其實我試圖讓數獨

沒有什麼比正則表達式簡單的解決方案,你甚至不需要來處理Validated event來實現它。

在這樣的情況下,只有某些字符需要防止用戶進入,處理KeyDown event很多更好的解決方案。用戶得到立即反饋,他們試圖輸入的信件沒有被接受。替代方案(ValidatingValidated事件)實際上等到用戶試圖離開文本框時粗暴地提醒他們輸入的內容無效。特別是對於一款遊戲來說,這往往會打破注意力,並不是特別方便用戶。

這樣做也使得它與單個文本框引發事件無關。相反,您將以與全部相同的方式處理文本框 - 通過完全忽略全部無效輸入。

這裏就是我想要做的:

  1. 首先,將一個處理方法,以您的文本框的KeyDown event。您可以從屬性窗口在設計做到這一點,或者你可以做到這一點通過代碼,因爲你在問題有:

    textbox[i,j].KeyDown += TextBox_KeyDown; 
    
  2. 然後,你需要把邏輯成決定了你的事件處理程序方法如果用戶只需按下的鍵是在允許的範圍內(通過I A),或外部的它:

    private void TextBox_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e)   
    { 
        // Determine if the keystroke was a letter between A and I 
        if (e.KeyCode < Keys.A || e.KeyCode > Keys.I) 
        { 
         // But allow through the backspace key, 
         // so they can correct their mistakes! 
         if (e.KeyCode != Keys.Back) 
         { 
          // Now we've caught them! An invalid key was pressed. 
          // Handle it by beeping at the user, and ignoring the key event. 
          System.Media.SystemSounds.Beep.Play(); 
          e.SuppressKeyPress = true; 
         } 
        } 
    } 
    

如果你想限制用戶鍵入只有一個字母,就可以添加代碼來處理上述方法中的代碼,或者您可以採用更簡單的路線並讓文本盒子控制自動處理它。要做到這一點,設置文本框的MaxLength propertytrue,無論是在設計或通過代碼:

textbox[i,j].MaxLength = true; 
+0

+1爲給出OP所需的答案而不是他們所要求的答案! – 2011-04-21 11:36:32

+0

@David:我經常會問我在評論中做的煩人問題的原因......我試圖弄清楚最好的解決方案是什麼,很少是第一個出現在提問者頭腦中的問題。在這裏,新手不會比我們經驗豐富的黑客更加錯誤。如果我們知道最好的方法,我們就不會問這個問題。不過,感謝您的認可。 – 2011-04-21 11:43:27

+0

錯誤沒有爲'TextBox_KeyDown'重載匹配委託'System.EventHandler' – Aenu 2011-04-21 11:53:56

2

,如果這個工程的文本框[1,1],你可以註冊private void TextBox_KeyPress(object sender, EventArgs e)作爲事件處理程序爲所有的文本框,並代替textbox[1,1]你可以使用((TextBox)sender)

+0

錯誤'WindowsFormsApplication1.Form2.txtRegExStringIsValid(string)'的最好的重載方法匹配有一些無效的參數 – Aenu 2011-04-21 11:03:38

0

檢查sender的文本而不是任何textbox[1,1]是。

+0

你怎麼能給代碼 – Aenu 2011-04-21 11:04:10

+0

@Aenu請參閱David Hall的回答。 – jonsca 2011-04-21 11:05:18

0

使用事件處理函數的sender參數來標識負責該事件的文本框。

0

,這將有助於你是鑄造你的事件的發送者這樣一個TextBox的第一件事:

(同時,隨着科迪格雷說,這是一個TextBox_Validated事件,沒有按鍵事件所以我將其更改爲適當的)

private void TextBox_Validated(object sender, EventArgs e)   
{   
     TextBox tb = sender as TextBox() 

     if (sender == null) 
      return; 

     bool bTest = txtRegExStringIsValid(tb.Text.ToString()); 
     ToolTip tip = new ToolTip();      
     if (bTest == false)     {       
      tip.Show("Only A-I", tb, 2000);       
     tb .ext = " ";  
} 

接下來,您需要真正進入每個文本框的代碼。有兩種明顯的方法,您可以將事件處理程序分配給數組中的每個文本框,也可以使用自定義文本框始終執行此驗證,然後將其添加到數組中。

分配事件處理程序,以文本框

foreach(var tb in textbox) 
{ 
    tb.Validated += new EventHandler(TextBox_KeyPress); 
} 

創建自定義文本框控件

創建自定義文本框控件(添加用戶控件到項目),然後只用它完全按照自己的會正常的文本框。

public partial class ValidatingTextBox: TextBox 
{ 
    public ValidatingTextBox() 
    { 
     InitializeComponent(); 
    } 

    protected override void OnValidating(CancelEventArgs e) 
    { 
     bool bTest = txtRegExStringIsValid(this.Text.ToString()); 
     ToolTip tip = new ToolTip(); 
     if (bTest == false) 
     { 
      tip.Show("Only A-I", this, 2000); 
      this.Text = " "; 
     } 
    } 

    private bool txtRegExStringIsValid(string textToValidate) 
    { 
     // Exactly the same validation logic as in the same method on the form 
    } 
}