Leonard
Leonard

Reputation: 139

How can I know which object is clicked in C#?

The pic below is the screenshot of my C# app

To make sure that the user name input is valid, I added such callback method to do the verification:

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

The method will be called when user finished their inputting(the method is bounded with the event-"leaving the input box"). It works when user left a invalid User_Name and begin to enter a password.

But it also works when user click another tab, e.g. the Register tab. I don't want this happen. Because the user obviously don't wanna login anymore if he clicks "Register" tab, and my C# app shouldnot pop up a warning box and force them inputting a valid user name again.

How can the C# tell the difference of such 2 situations? It should be easy if I know which object is being clicked.

Upvotes: 1

Views: 225

Answers (3)

sarat
sarat

Reputation: 11160

I am not sure if there's a right solution for this particular scenario here.

When you add a handler to validate your control on mouse leave, definitely it will be executed first regardless you clicked on another control within the tab or another tab itself.

This normal flow can't be ignored easily. It must be possible by hanlding the message loop yourself but the event based flow, first leave focus, and selected index change (selecting) event will be fired. I would suggest you not to disturb the flow as the validation is client side and pretty fast. Instead of messagebox, I would recommend you to use ErrorProvider and attach to the control whenever required. Also messagebox is quite disturbing and as per your code, you're forcefully making it focus to the textbox again.

How about the following code?

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

Upvotes: 0

jordanhill123
jordanhill123

Reputation: 4182

Here's an option:

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

Upvotes: 1

Adil
Adil

Reputation: 148180

You will have source of event in object sender in UserNameInput_Leave event.

private void UserNameInput_Leave(object sender, EventArgs e)
{
     //sender is source of event here
}

Upvotes: 2

Related Questions