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

我如何知道在C#中单击了哪个对象?,c#,focus,mouseleave,C#,Focus,Mouseleave,为了确保用户名输入有效,我添加了这样的回调方法来进行验证: 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

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

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();
    }
}
当用户完成输入时,将调用该方法(该方法与事件“离开输入框”绑定)。当用户留下一个无效的用户名并开始输入密码时,它就会工作

但是,当用户单击另一个选项卡(例如“注册”选项卡)时,它也会起作用。我不想这样。因为如果用户点击“注册”标签,他显然不想再登录,我的C#app不应该弹出警告框,强迫他们再次输入有效用户名


C#如何区分这两种情况?如果我知道正在单击哪个对象,这应该很容易。

您将在
UserNameInput\u Leave
事件中的对象
sender
中拥有事件的
source

private void UserNameInput_Leave(object sender, EventArgs e)
{
     //sender is source of event here
}
这里有一个选项:

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();
        }
    }

我不确定是否有一个正确的解决方案来解决这个特定的场景

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

这种正常的流动不容易被忽视。必须能够通过自己hanlding消息循环,但将触发基于事件的流、首次离开焦点和所选索引更改(选择)事件。我建议您不要干扰流程,因为验证是客户端的,而且非常快。我建议您使用
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");
        }
    }
}

当用户单击提交按钮时,为什么不进行检查?你不会再有问题了…做一件事。。请尝试密码“OnSetFocus()”或类似的操作,而不是“离开”事件。。以便满足预定义的条件。但在这方面,你将面临另一个问题。“如果用户直接进入密码字段怎么办”,再做一件事,一旦用户名字段得到一些输入,启用密码字段,直到禁用输入。。希望你能得到……谢谢你,@LaGrandMere。点击提交按钮后进行检查一定会更容易,但它只解决了我目前遇到的问题,并没有回答我提出的问题。也许有一天,我还要在另一个场景中实现这样的功能。To@Hiren潘迪亚:到目前为止,只有这条路是我想要的。但它看起来仍然不完美。如果我有更多字段要填充怎么办?e、 g.用户名、密码、性别、收入、昵称等。在这种情况下,我必须在密码输入、性别输入、收入输入、昵称输入事件中添加检查逻辑。有点重复,不是吗?当Leave事件被触发时,哪个控件具有焦点?如果不是文本框,您可以确定哪个元素有文本框并使用或不使用您的操作。另一种方法是确定离开事件上光标的X和Y,如果光标在选项卡上,则不执行任何操作,否则执行弹出窗口。在这两种情况下,源不总是他的文本框吗?@LaGrandMere说实话,这种方法没有帮助。嘿,亲爱的@jordanhill123。离开事件的发送者始终是文本框-“UserNameInput”本身。这意味着,问题仍然存在。给客户一个警告的好方法。但是我仍然需要找到其他东西来代替“离开事件”。如果你可以使用WinProc处理windows消息,那么你就可以实现你的逻辑,但你必须在成本和从中获得的价值之间取得平衡。