1

下图是我的 C# 应用程序的屏幕截图

为了确保用户名输入有效,我添加了这样的回调方法来进行验证:

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# 如何区分这两种情况?如果我知道单击了哪个对象应该很容易。

4

3 回答 3

2

您将source在事件中sender发生UserNameInput_Leave事件。

private void UserNameInput_Leave(object sender, EventArgs e)
{
     //sender is source of event here
}
于 2013-03-26T10:26:53.277 回答
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();
        }
    }
于 2013-03-26T10:33:33.310 回答
0

我不确定这里是否有适合这种特殊情况的正确解决方案。

当您添加一个处理程序来验证您的鼠标离开时的控件时,无论您单击选项卡中的另一个控件或另一个选项卡本身,它肯定会首先执行。

这种正常的流程不能轻易忽视。必须通过自己处理消息循环来实现,但将触发基于事件的流程、第一次离开焦点和选定的索引更改(选择)事件。我建议您不要打扰流程,因为验证是客户端并且非常快。我建议您在ErrorProvider需要时使用并附加到控件,而不是消息框。消息框也很令人不安,根据您的代码,您正在强制将其再次聚焦到文本框。

下面的代码怎么样?

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");
        }
    }
}
于 2013-03-26T11:24:59.510 回答