为了确保用户名输入有效,我添加了这样的回调方法来进行验证:
Regex UserNameRE = new Regex(@"^[a-zA-Z]\w*$");
//being called when input box is not focused any more
private void UserNameInput_Leave(object sender, EventArgs e)
{
//pop up a warning when user name input is invalid
if (!UserNameRE.IsMatch(UserNameInput.Text))
{
MessageBox.Show("Invalid User Name!");
this.UserNameInput.Text = "";
this.UserNameInput.Focus();
}
}
当用户完成输入时,该方法将被调用(该方法与事件有关 - “离开输入框”)。当用户离开无效的User_Name并开始输入密码时,它可以正常工作。
但是当用户点击另一个标签时,它也有效,例如注册选项卡。我不希望这种情况发生。因为如果用户单击“注册”选项卡,显然不想再登录,并且我的C#应用程序不应弹出警告框并强制他们再次输入有效的用户名。
C#如何区分这两种情况?如果我知道点击了哪个对象应该很容易。
答案 0 :(得分:2)
source
事件中对象sender
中有UserNameInput_Leave
个事件。
private void UserNameInput_Leave(object sender, EventArgs e)
{
//sender is source of event here
}
答案 1 :(得分:1)
这是一个选项:
private void UserNameInput_Leave(object sender, EventArgs e)
{
if (sender.GetType() != typeof(TextBox))
{
return;
}
TextBox tBox = (TextBox)sender;
//pop up a warning when user name input is invalid
if (!UserNameRE.IsMatch(UserNameInput.Text) && tBox.Name == UserNameInput.Name)
{
MessageBox.Show("Invalid User Name!");
this.UserNameInput.Text = "";
this.UserNameInput.Focus();
}
}
答案 2 :(得分:0)
我不确定这个特定场景是否有正确的解决方案。
当您添加处理程序以在鼠标离开时验证您的控件时,无论您是否单击选项卡中的其他控件或其他选项卡本身,它都将首先执行。
这种正常流动不容易被忽略。必须有可能通过自己处理消息循环,但基于事件的流,首先离开焦点,以及选择的索引更改(选择)事件将被触发。我建议你不要打扰流程,因为验证是客户端并且非常快。我会建议您使用ErrorProvider
而不是messagebox,并在需要时附加到控件。 messagebox也非常令人不安,根据你的代码,你强行让它再次聚焦到文本框。
以下代码怎么样?
public partial class Form1 : Form
{
ErrorProvider errorProvider = new ErrorProvider();
public Form1()
{
InitializeComponent();
textBox1.Validating += new CancelEventHandler(textBox1_Validating);
}
private void textBox1_Leave(object sender, EventArgs e)
{
textBox1.CausesValidation = true;
}
void textBox1_Validating(object sender, CancelEventArgs e)
{
Regex UserNameRE = new Regex(@"^[a-zA-Z]\w*$");
if (!UserNameRE.IsMatch(textBox1.Text))
{
errorProvider.SetError(this.textBox1, "Invalid username");
}
}
}