【问题标题】:How to validate array of text boxes如何验证文本框数组
【发布时间】:2011-04-21 10:49:39
【问题描述】:

我正在使用 c# winform。

我有文本框的二维数组,我希望它们只接受来自 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;
    }
}

谁能指导我该怎么做才能使此代码适用于所有文本框?

【问题讨论】:

  • 为什么将KeyPress事件处理方法注册为Validated事件的处理方法?这两个处理程序方法中的逻辑应该非常不同。
  • 我是初学者请指导我怎么做?
  • 使用两个不同的事件处理程序。我不知道您要完成什么,因此很难提出更详细的建议。每次按下一个键时应该进行什么验证,而当用户完全完成输入文本时应该进行验证?
  • 我希望文本框只接受来自 a-i 的字母,实际上我正在尝试制作数独

标签: c# .net winforms textbox


【解决方案1】:

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

【讨论】:

  • 错误 2 'WindowsFormsApplication1.Form2.txtRegExStringIsValid(string)' 的最佳重载方法匹配有一些无效参数
【解决方案2】:

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

有一个比正则表达式简单的解决方案,你甚至不需要处理Validated event 来实现它。

在这种情况下,您只想阻止用户输入某些字符,处理KeyDown event 是一个非常更好的解决方案。用户立即收到他们尝试输入的字母未被接受的反馈。替代方案(ValidatingValidated 事件)实际上是等到用户尝试离开文本框时才粗鲁地提醒他们他们的输入无效。尤其是对于游戏而言,这往往会分散注意力,而且对用户不是特别友好。

这样做也使得哪个单独的文本框引发了事件变得无关紧要。相反,您将对 all 的文本框以相同的方式处理它——完全忽略 all 无效输入。

这是我要做的:

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

如果你想限制用户只能输入一个字母,你可以在上面的方法中添加代码来处理它,或者你可以采取更简单的方法,让文本框控件自动为你处理。为此,请在设计器中或通过代码将文本框的 MaxLength property 设置为 true

textbox[i,j].MaxLength = true;

【讨论】:

  • +1 给出了 OP 需要的答案,而不是他们要求的答案!
  • @David:我经常问我在 cmets 中做的烦人问题是有原因的...我试图找出 最好的 解决方案是什么,很少提问者脑海中浮现的第一个。新手在这里并没有比我们经验丰富的黑客更多的错。如果我们知道最好的方法,我们就不会问这个问题。不过,感谢您的认可。
  • 错误 1 ​​'TextBox_KeyDown' 没有重载匹配委托 'System.EventHandler'
  • @Aenu:嗯,不,代码工作得很好。您必须在表单文件中包含这两部分。如果找不到TextBox_KeyDown方法,则无法添加handler。
  • @Aenu:我将第一部分修改为如下所示:textbox[i,j].KeyDown += TextBox_KeyDown; 确保这是你所拥有的。
【解决方案3】:

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

【讨论】:

  • @Aenu 请参阅 David Hall 的回答。
【解决方案4】:

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

【讨论】:

    【解决方案5】:

    对您有帮助的第一件事是将事件的发送者转换为这样的文本框:

    (另外,正如 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 = " ";     
    }
    

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

    将事件处理程序分配给文本框

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-05-10
      • 1970-01-01
      • 2014-07-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多