通过单击或 TabControl 中的键禁用选项卡之间的切换

Disable switching between tabs by click or keys in TabControl

伙计们,是否可以仅使用 NEXT 按钮切换到另一个选项卡?

这意味着您不能通过单击另一个标签页来切换到另一个标签页。

我通常在 NEXT 按钮上使用的代码是这样的:

tabControl1.SelectedTab = tabPage2;

试一试这个

tabControl1.SelectTab(tabPage2);

在索引上

tabControl1.SelectTab(1); 

Tablist 是基于 0 的索引,因此“1”是第二个标签。

TabControls Selecting 事件将禁用切换,但我们需要使用 bool 值跟踪按钮的 click,否则按钮的 click 不会 select 选项卡。

bool checkCancel = true;
private void button2_Click(object sender, EventArgs e)
{
    checkCancel = false;
    tabControl1.SelectTab("tabPage2");
}

private void tabControl1_Selecting(object sender, TabControlCancelEventArgs e)
{
    e.Cancel = checkCancel;
    checkCancel = true;
}

结果,(顺便说一下,尝试点击 gif 中的标签页 :))

您可以将 ControlStyles.UserMouse 设置为 true。这样你就可以简单地禁用选项卡 headers.

上的鼠标

顺便说一句,仅禁用点击 headers 是不够的,您需要禁用让用户在选项卡之间切换的键,例如 Shift +Tab, Ctrl+Shift+Tab, , , Home and End.

using System.Linq;
using System.Windows.Forms;
using System.ComponentModel;
public class MyTabControl : TabControl
{
    public MyTabControl()
    {
        if (LicenseManager.UsageMode != LicenseUsageMode.Designtime)
            SetStyle(ControlStyles.UserMouse, true);
    }
    protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
    {
        var filteredKeys = new Keys[]{(Keys.Control | Keys.Tab),
            (Keys.Control | Keys.Shift | Keys.Tab),
            Keys.Left, Keys.Right, Keys.Home, Keys.End};
        if (filteredKeys.Contains(keyData))
            return true;
        return base.ProcessCmdKey(ref msg, keyData);
    }
}

注意:如果你喜欢wizard-like控件(没有header的选项卡控件),你可以处理TCM_ADJUSTRECTthis。您也应该在该解决方案中禁用这些键。这是更改后的版本:

using System.Linq;
using System.Windows.Forms;
using System.ComponentModel;
public class WizardControl: TabControl
{
    protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
    {
        var filteredKeys = new Keys[]{(Keys.Control | Keys.Tab),
            (Keys.Control | Keys.Shift | Keys.Tab),
            Keys.Left, Keys.Right, Keys.Home, Keys.End};
        if (filteredKeys.Contains(keyData))
            return true;
        return base.ProcessCmdKey(ref msg, keyData);
    }
    public const int TCM_FIRST = 0x1300;
    public const int TCM_ADJUSTRECT = (TCM_FIRST + 40);
    protected override void WndProc(ref Message m)
    {
        if (m.Msg == TCM_ADJUSTRECT && !DesignMode)
           m.Result = (IntPtr)1;
        else 
           base.WndProc(ref m);
    }
}

其中一种选择是尝试简单 IsHitTestVisible="False"