C# 如何在C中将Enter键解释为制表符#

C# 如何在C中将Enter键解释为制表符#,c#,.net,winforms,keypress,C#,.net,Winforms,Keypress,我最近刚开始从事C#development,当时我正在从事一个基于表单的项目,当用户在表单上并按下Enter键时,我试图执行一个“tab”操作 我知道答案可能很简单,但我是这个领域的新手。欢迎来到SO Tex 我相信有两种方法可以实现这一点,只需添加: 选项1:如果执行了Enter键,则抓取下一个控件 private void [YourFormName]_KeyDown(object sender, KeyEventArgs e) { if (e.KeyCode == Keys.Enter

我最近刚开始从事C#development,当时我正在从事一个基于表单的项目,当用户在表单上并按下Enter键时,我试图执行一个“tab”操作

我知道答案可能很简单,但我是这个领域的新手。

欢迎来到SO Tex

我相信有两种方法可以实现这一点,只需添加:

选项1:如果执行了Enter键,则抓取下一个控件

private void [YourFormName]_KeyDown(object sender, KeyEventArgs e)
{
  if (e.KeyCode == Keys.Enter)
  {
     SendKeys.Send("{TAB}");
  }
}
在表单的属性中,将表单的KeyPreview属性设置为
true

下面的代码将捕获您的“Enter Press”事件并执行您正在查找的逻辑:

private void [YourFormName]_KeyDown(object sender, KeyEventArgs e)
{
    Control nextControl ;
    //Checks if the Enter Key was Pressed
    if (e.KeyCode == Keys.Enter) 
    {
        //If so, it gets the next control and applies the focus to it
        nextControl = GetNextControl(ActiveControl, !e.Shift);
        if (nextControl == null)
        {
            nextControl = GetNextControl(null, true);
        }
        nextControl.Focus();
        //Finally - it suppresses the Enter Key
        e.SuppressKeyPress = true;
    }
} 
这实际上允许用户按“Shift+Enter”转到“继续”选项卡

选项2:使用方法

private void [YourFormName]_KeyDown(object sender, KeyEventArgs e)
{
  if (e.KeyCode == Keys.Enter)
  {
     SendKeys.Send("{TAB}");
  }
}

我不确定这种方法是否仍然普遍使用,或者可能被认为是一种“黑客”?我会推荐第一个控件,但我相信这两个控件都能满足您的需要。

首先,准备一个字典,其中键是第一个控件,值是第二个控件。循环遍历表单控件集合中的所有控件,按TabIndex将它们放入排序列表中,并将其转换为字典

每个对象或子类文本框都需要KeyPress事件中的代码来包含此逻辑。无论哪种方式,在按键事件中,如果输入为Enter,则从字典中获取以下控件并使用control.GetFocus()


希望有帮助!如果您愿意,我可以提供更多细节。

您可以使用application.AddMessageFilter和IMessageFilter接口在表单级别和完整应用程序级别处理键盘事件

所有这些事件都有“Handled”属性,如果要手动处理某个键,可以将该属性设置为“True”。(在您的情况下,输入key)


下面是一个如何捕获两个级别的关键事件的示例:

可能的重复。值得注意的是,这不是Windows中的标准行为。覆盖它不仅会让您的用户感到困惑,而且尝试覆盖默认值总是比按照您的平台期望您的方式来做更多的工作。像这样的代码很容易成为维护的噩梦,其中潜藏着奇怪的错误。@Cody-可悲的是,我真的想过自己做这件事,但仅仅因为ToolStripBar控件默认没有TabStop属性,我们最终只是摆脱了ToolStrip(我们正处于这样一个可能的阶段)@Ramhound:那是因为
ToolStrip
/
ToolStripMenuBar
上的项目无法获得焦点。无论项目的哪个阶段,你都会发现你需要摆脱它并改变你的设计。我个人肯定会推荐选项2。事实证明,这对我来说要容易得多,而且这种行为正是我们在这个案例中所寻找的。非常感谢。