如何验证文本框的数组

时间:2011-04-21 10:49:39

标签: c# .net winforms textbox

我正在使用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;
    }
}

任何人都可以指导我应该做什么使这个代码适用于所有文本框?

5 个答案:

答案 0 :(得分:2)

如果这适用于文本框[1,1],您可以将private void TextBox_KeyPress(object sender, EventArgs e)注册为所有文本框的事件处理程序,而不是textbox[1,1]您可以使用((TextBox)sender)

答案 1 :(得分:1)

  

我希望文本框只接受来自a-i的字母,实际上我正在尝试制作数独

与正则表达式相比,更多更简单的解决方案,您甚至不需要处理Validated event来实现它。

在这种情况下,只有某些字符要阻止用户输入,处理KeyDown event是一个很多更好的解决方案。用户获得立即反馈,表明他们尝试输入的信件未被接受。替代方案(ValidatingValidated事件)实际上等到用户尝试离开文本框以粗鲁地警告他们输入无效。特别是对于游戏来说,这往往会打破注意力,并不是特别方便用户。

这样做也会使个别文本框引发事件变得无关紧要。相反,您将以相同的方式处理所有文本框 - 完全忽略所有无效输入。

这就是我要做的事情:

  1. 首先,将处理程序方法附加到文本框的KeyDown event。您可以从设计器的“属性”窗口执行此操作,也可以通过代码执行此操作,如问题中所示:

    textbox[i,j].KeyDown += TextBox_KeyDown;
    
  2. 然后,您需要将逻辑放入事件处理程序方法中,该方法确定用户刚按下的键是否在允许的范围内(A到I),或者在其外部:

    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;
            }
        }
    }
    
  3. 如果您想限制用户只输入一个字母,您可以添加代码来处理上述方法中的代码,或者您可以采用更简单的路径并让文本框控件自动为您处理。为此,请在设计器中或通过代码将文本框的MaxLength property设置为true

    textbox[i,j].MaxLength = true;
    

答案 2 :(得分:0)

检查sender的文字,而不是textbox[1,1]的内容。

答案 3 :(得分:0)

使用事件处理程序的sender参数来标识负责该事件的文本框。

答案 4 :(得分:0)

第一件可以帮助您的事情是将事件的发件人转换为TextBox,如下所示:

(另外,正如Cody Gray所说,这是一个TextBox_Validated事件,而不是KeyPress事件,所以我已经适当地重命名了它)

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 = " ";     
}

接下来,您需要为每个文本框实际进入该代码。有两种明显的方法,您可以将事件处理程序分配给数组中的每个文本框,也可以使用自定义文本框,始终执行此验证,然后将其添加到数组中。

将eventhandler分配给文本框

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
    }
}