代码之家  ›  专栏  ›  技术社区  ›  TheSean

在TabControl中选择Tab页而不窃取焦点

  •  8
  • TheSean  · 技术社区  · 15 年前

    使用 TabControl.SelectTab("...") 显示选项卡,但也提供选项卡焦点。我想显示一个特定的标签,但保持焦点在它所在的位置。

    谢谢。

    4 回复  |  直到 15 年前
        1
  •  3
  •   digEmAll    15 年前

    我不认为有内置函数,但您可以这样做:

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

    在这里,我备份当前的焦点控件,选择所需的选项卡,最后将焦点设置为原始控件。

    SelectionChanged 事件再次发生,导致无限循环。

        2
  •  14
  •   Jeff Ogata    15 年前

    您可以尝试禁用 TabControl

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

    为了安全起见,您可以将行放在finally块中重新启用TabControl,以确保它不会被禁用。

        3
  •  1
  •   Darshan Lila    11 年前

    这将选择选项卡页面,同时将焦点保持在顶部,如上面所述:

                tc.TabPages[0].Enabled = false;
                tc.SelectTab(0);
                tc.TabPages[0].Enabled = true;
    

    tc是我的例子 类型(即,它是我的选项卡控件,它有几个“选项卡页”)。这对我很合适。我的目的是用左右键循环浏览这些标签页 (arrows) i、 当我向前走时 Key.Right tabpage 我想集中精力 [0] 不激活 我在那一页上有,当我倒退时 Key.Left )并达到 [0] [tc.TabCount-1] 启用,这是最后一个。本案代码为:

                tc.TabPages[tc.TabCount - 1].Enabled = false;
                tc.SelectTab(tc.TabCount - 1);
                tc.TabPages[tc.TabCount - 1].Enabled = true;
    

    完整的代码是:

        private bool KeyTc(System.Windows.Forms.Keys keyData)
        {
            if (keyData == K.Left && tc.SelectedIndex == 0)
            {
                tc.TabPages[tc.TabCount - 1].Enabled = false;
                tc.SelectTab(tc.TabCount - 1);
                tc.TabPages[tc.TabCount - 1].Enabled = true;
                return true;
            }
            else if (keyData == K.Right && tc.SelectedIndex == tc.TabCount - 1)
            {
                tc.TabPages[0].Enabled = false;
                tc.SelectTab(0);
                tc.TabPages[0].Enabled = true;
                return true;
            }
            return false;
        }
    

    这个布尔 KeyTc 返回switch语句中的case进行键计算:

    protected override bool ProcessCmdKey(ref Message keyMsg, Keys keyData)
        { switch keyData { ... } }
    
        4
  •  0
  •   Mohamed-ali MAAMAR    10 年前

    基于Jeff Ogata提出的解决方案:在设置所选选项卡之前,可以尝试禁用TabControl,然后重新启用它。这将阻止它集中注意力”,下面是我的解决方案:

    tabMain.SelectedPageChanging += (s, e) =>
            { 
                tabMain.Enabled = false;
            };
    
            tabMain.SelectedPageChanged += (s, e) =>
            {
                tabMain.Enabled = true;                
            };
    

    注意:此代码使用DevExpress“DevExpress.XtraTab.XtraTabControl”。

    推荐文章