【发布时间】:2016-11-16 10:52:47
【问题描述】:
各位,是否可以通过仅使用 NEXT 按钮切换到另一个选项卡?
这意味着您不能通过单击另一个标签页来切换到另一个标签页。
我通常在 NEXT 按钮上使用的代码是这样的:
tabControl1.SelectedTab = tabPage2;
【问题讨论】:
标签: c# winforms tabcontrol
各位,是否可以通过仅使用 NEXT 按钮切换到另一个选项卡?
这意味着您不能通过单击另一个标签页来切换到另一个标签页。
我通常在 NEXT 按钮上使用的代码是这样的:
tabControl1.SelectedTab = tabPage2;
【问题讨论】:
标签: c# winforms tabcontrol
TabControls Selecting 事件将禁用切换,但我们需要使用bool 值跟踪按钮的click,否则按钮的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;
}
结果,(顺便说一句,试图点击 gif 上的标签页 :))
【讨论】:
您可以将ControlStyles.UserMouse 设置为true。这样您就可以简单地禁用标签页眉上的鼠标。
顺便说一句,仅仅禁用点击标题是不够的,您需要禁用让用户在选项卡之间切换的键,例如 Shift+Tab, Ctrl+Shift+Tab, ←, →, 首页 和 结束。
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);
}
}
注意:如果你喜欢有一个类似向导的控件(没有标题的选项卡控件),你可以像this一样处理TCM_ADJUSTRECT。您也应该在该解决方案中禁用这些键。这是一个修改后的版本:
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);
}
}
【讨论】:
MyTabControl 和第二个 WizardControl 之间的区别。在设计时,它们都像标准的TabControl,但在运行时,WizardControl 不显示选项卡标题。它就像一个多面板,让您在设计时使用所有选项卡页面,但在运行时您可以使用代码在选项卡之间切换,就像向导所期望的那样。 MyTabControl 在朗姆酒时间就像一个普通的TabControl 带有标题,但要在选项卡之间切换,您应该使用代码(例如按钮的单击事件来设置选定的选项卡)。
试试这个
tabControl1.SelectTab(tabPage2);
在索引上
tabControl1.SelectTab(1);
Tablist 是基于 0 的索引,因此“1”是第二个选项卡。
【讨论】:
其中一个选项是尝试简单的IsHitTestVisible="False"
【讨论】: