【发布时间】:2011-04-14 13:29:05
【问题描述】:
通常在按下 TAB 键时,您会将焦点更改到给定 Tab 键顺序中的下一个控件。我想阻止这种情况并让 TAB 键执行其他操作。就我而言,我想将焦点从组合框更改为完全不同的控件。我不能通过设置标签顺序来做到这一点。我需要以编程方式执行此操作。知道怎么做吗?似乎 KeyDown 和 KeyPress 事件无法正确处理 TAB 键。 谢谢。
【问题讨论】:
通常在按下 TAB 键时,您会将焦点更改到给定 Tab 键顺序中的下一个控件。我想阻止这种情况并让 TAB 键执行其他操作。就我而言,我想将焦点从组合框更改为完全不同的控件。我不能通过设置标签顺序来做到这一点。我需要以编程方式执行此操作。知道怎么做吗?似乎 KeyDown 和 KeyPress 事件无法正确处理 TAB 键。 谢谢。
【问题讨论】:
在您的表单上覆盖 ProcessDialogKey 或 ProcessTabKey,并根据所关注的控件执行您想要的逻辑。
【讨论】:
根据 JRS 使用 PreviewKeyDown 事件的建议,这会将按键发送到控件:
private void textBox1_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e)
{
if (e.KeyCode == Keys.Tab)
e.IsInputKey = true;
}
如果你想自定义行为,你可以处理控件的 KeyDown 事件:
private void textBox1_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Tab)
{
MessageBox.Show("The tab key was pressed while holding these modifier keys: "
+ e.Modifiers.ToString());
}
}
如果控件派生自TextBoxBase(即TextBox 或RichTextBox),并且Multiline 属性设置为true,那么您可以简单地将AcceptsTab 属性设置为true。
TextBoxBase.AcceptsTab Property
获取或设置一个值,该值指示在多行文本框控件中按下 TAB 键是否会在控件中键入 TAB 字符,而不是将焦点移到 Tab 键顺序中的下一个控件。
【讨论】:
e.SuppressKeyPress = true; 添加到示例中,但奇怪的是MessageBox 似乎阻止它工作(这是一个完全独立的问题)。
覆盖控件的 LostFocus 事件,示例见下面的链接:
http://msdn.microsoft.com/en-us/library/system.windows.forms.control.lostfocus.aspx
【讨论】:
由于我正在构建用户控件,因此我最终在控件上使用了PreviewKeyDown 事件。这避免了必须处理主机表单上的按键事件。
http://msdn.microsoft.com/en-us/library/system.windows.forms.control.previewkeydown.aspx
【讨论】:
您可以在 KeyDown 活动中尝试此代码:
if (e.KeyCode == Keys.Tab) {
//your logic
e.SuppressKeyPress = true;
}
如果单击的按钮是 Tab,则执行任何您想要的自定义逻辑,然后调用 SuppressKeyPress 以停止触发 KeyPress 事件并为您调用正常的 Tab 逻辑。
【讨论】: