Kazud
Kazud

Reputation:

Windows Forms: detect the change of the focused control

I'm implementing copy-paste in a Windows Forms application. I need to enable/disable the bar-buttons for this two operations when the user changes the focused element in the application.

I can find the current focused control using something like this: http://www.syncfusion.com/FAQ/windowsforms/faq_c41c.aspx#q1021q, but how can I detect that the focused control has changed?

Upvotes: 4

Views: 9272

Answers (4)

daniele3004
daniele3004

Reputation: 13890

To detect the focus on a control you can create this event:

void MyGotFocus(object sender, EventArgs e)
{
    if (sender is TextBox)
    {
        //TODO YOUR OPERATION
        //FOR EXAMPLE
        (sender as TextBox).SelectAll();
    }
}

and the next step is to associate the control and event by code:

myText1.GotFocus += MyGotFocus;
myText2.GotFocus += MyGotFocus;

Upvotes: 0

Paul Sasik
Paul Sasik

Reputation: 81429

In your form load event handler you could also loop through all of the controls contained in the form and for each focusable control add an event handler for the Enter event:

    private void Form1_Load(object sender, EventArgs e)
    {
        foreach (Control control in Controls)
        {
            control.Enter += ControlReceivedFocus;
        }
    }

    void ControlReceivedFocus(object sender, EventArgs e)
    {
        Debug.WriteLine(sender + " received focus.");
    }

Upvotes: 11

arbiter
arbiter

Reputation: 9575

My proposal is to use Application.Idle event.

  • Write logic that enables/disables your buttons in Application.Idle event.
  • Subscribe to Application.Idle event on form shown event
  • Check button availability on button click (so you never pass accidental click under heavy load)
  • Do not forget to remove Idle handler on form disposing (or closing), because this is static event

Using this technique you will always have correct buttons state, and you not need to worry about subscribing to many controls events to detect focus change. This is also light-weight approach, because Idle event is raised only when application is not busy.

Upvotes: 2

Tamás Szelei
Tamás Szelei

Reputation: 23921

I think you should add an event handler to the control (or if you have many of the same type, subclass it, and override the appropriate OnChange handler). This way you won't have to 'find' the focused control (it will be given as the sender parameter), and the event will only arise when the change actually happened.

Upvotes: 1

Related Questions