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

pha*_*pha 3 c# tabcontrol winforms

在此输入图像描述

那么伙计们,是否可以通过NEXT按钮切换到另一个标签?

这意味着您无法通过单击其他选项卡切换到另一个选项卡页面.

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

tabControl1.SelectedTab = tabPage2;
Run Code Online (Sandbox Code Playgroud)

Ber*_*kay 6

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

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;
}
Run Code Online (Sandbox Code Playgroud)

结果,(顺便说一下,试图点击gif上的tabpages :))

在此输入图像描述

希望有帮助,


Rez*_*aei 3

您可以设置ControlStyles.UserMouse为true。这样您就可以简单地在选项卡标题上禁用鼠标。

\n\n

顺便说一句,仅禁用标题上的单击是不够的,您需要禁用允许用户在选项卡之间切换的键,例如Shift+ TabCtrl+ Shift+ Tab\xe2\x86\x90\xe2\x86\x92HomeEnd顺便说一句,仅禁用标题上的单击是不够的,您需要禁用允许用户在选项卡

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

注意:如果你喜欢有一个类似向导的控件(没有标题的选项卡控件),你可以这样TCM_ADJUSTRECT处理处理。您也应该在该解决方案中禁用这些键。这是更改后的版本:

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