用户在winforms,.net 3.5 WEC7中尝试移动到其他控件(在验证失败时)后,将焦点保持在文本框上

时间:2013-12-12 09:13:52

标签: c# winforms validation

我希望在继续下一个TextBox时验证Userinput,并且如果inmput无效,则继续关注最后编辑的TextBox。 我尝试了Validating和LostFocus事件,但在这两种情况下,如果我尝试重新聚焦TextBox,验证失败,下一个文本框已经获得焦点,也会抛出验证事件...... 我想要的是什么:

TextBox A中的用户编辑 用户离开TextBox A(单击TextBox B或Tab或...)
TextBox A中的输入经过验证 如果验证失败,则会显示MessageBox 焦点停留在TextBox A

发生了什么:
用户在TextBox A中编辑 用户离开TextBox A(单击TextBox B或Tab或...)
TextBox A中的输入经过验证(在验证事件中)
如果验证失败,则会显示MessageBox 将焦点设置回TextBox A在文本框B中触发vaidating事件 TextBox B中没有输入,因此无效 显示了TextBox B的内容无效的消息 ... 另外,MSDN tells我不应该将Focus设置为以下任何事件:Enter,GotFocus,Leave,LostFocus,Validating或Validated。 那么如何将焦点返回到TextBox A,ifI是否必须在其中一个事件中设置焦点?

        private void TextBoxA_Validating(object sender, System.ComponentModel.CancelEventArgs e) {            
        if (!IsValid(TextBoxA.Text)) // Some Method that returns false if Input is invalid
        {
            ... // show a message
                TextBoxA.Focus();
        }                         
    }

    private void TextBoxB_Validating(object sender, System.ComponentModel.CancelEventArgs e) {            
        if (!IsValid(TextBoxB.Text)) // Some Method that returns false if Input is invalid
        {
            ... // show a message
                TextBoxB.Focus();
        }                         
    }

2 个答案:

答案 0 :(得分:0)

我没有对此进行测试,但如果验证失败,请不要使用txtbox.Focus()。您应该使用e.Cancel将其设置为true。试一试,看看这是否能解决问题。

答案 1 :(得分:0)

您应该使用select()功能来激活文本框,因为Focus()是用户控件开发人员的低级功能,如MSDN: Control.Focus()所述

您可以使用CancelEventArgs获取所需的行为:

private void textBox1_Validating(object sender, System.ComponentModel.CancelEventArgs e)
{

   if(!ValidEmailAddress(textBox1.Text))
   {
      // Cancel the event and select the text to be corrected by the user.
      e.Cancel = true;
      textBox1.Select(0, textBox1.Text.Length);

      // Set the ErrorProvider error with the text to display.  
      this.errorProvider1.SetError(textBox1, "Validation error message goes here");
   }
   else
   {
       this.errorProvider1.SetError(textBox1, ""); // clears the error
   }
}

最后提示:使用error provider向用户显示验证。 Messagebox对用户来说真的很不舒服。