如何知道在C#中单击了哪个对象?

时间:2013-03-26 10:24:50

标签: c# focus mouseleave

The pic below is the screenshot of my C# app

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

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

3 个答案:

答案 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");
        }
    }
}