Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Select Tab Page in TabControl without stealing focus

Tags:

c#

.net

winforms

Using TabControl.SelectTab("...") shows the tab but it also gives the tab focus. I would like to show a particular tab, but keep focus where it is.

I have data rows in a grid. Based on properties of the selected row, I show a different tab page to have a different UI layout. But when using arrow keys to scroll through rows, the focus switches to the selected tab -- which I don't want to happen.

Thanks.

like image 821
TheSean Avatar asked Oct 28 '10 15:10

TheSean


2 Answers

You can try disabling the TabControl before setting the selected tab, then re-enabling it. This will prevent it from taking focus. I tested this on a tab control with a few controls on it, and didn't see any visual change, but you'll have to try it in your UI and see whether it's ok for you.

tabControl1.Enabled = false;
tabControl1.SelectTab("tabPage4");
tabControl1.Enabled = true;

To be safe, you could put the line to re-enable the TabControl in a finally block to make sure it doesn't get left disabled.

like image 172
Jeff Ogata Avatar answered Sep 19 '22 14:09

Jeff Ogata


I don't think there's a built-in function, but you can do in this way:

private bool skipSelectionChanged = false;

private void dataGridView_SelectionChanged(object sender, EventArgs e)
{
    if (skipSelectionChanged)
        return;

    // supposing we decide tab[0] has to be selected...
    this.SelectTabWithoutFocus(this.tabControl1.TabPages[0]);
}

private void SelectTabWithoutFocus(TabPage tabPage)
{
    this.skipSelectionChanged = true;

    // "this" is the form in my case, so you get the current focused control
    // (ActiveControl), backup it, and re-set it after Tab activation

    var prevFocusedControl = this.ActiveControl;
    if (this.ActiveControl != null)
    {
        this.tabControl1.SelectedTab = tabPage;
        prevFocusedControl.Focus();
    }
    this.skipSelectionChanged = false;
}

Here, I backup the current focused control, select the desired tab, and finally set the focus to the original control.

Skipping boolean is necessary, because giving the focus to the grid you trigger SelectionChanged event again, causing infinite looping.

like image 43
digEmAll Avatar answered Sep 18 '22 14:09

digEmAll