我希望在继续下一个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();
}
}
答案 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对用户来说真的很不舒服。