按下箭头键时跳转组合框

Mar*_*inS 2 c# combobox arrow-keys winforms

当我在每个将 tabstop 属性设置为 true 的控件上按向上/向下箭头时,就会选择 PREVOIUS/NEXT tabindex。它工作正常,但是当ComboBox聚焦时,它会改变它的值,因为它也捕获了箭头。

如何在不将击键发送到 ComboBox 的情况下实现 tabindex 跳转?

处理tabindex跳转的代码:

private void ParentForm_KeyDown(object sender, KeyEventArgs e)
    { 
    Control ctl;
    ctl = (Control)sender;
    if (e.KeyCode == Keys.Down || e.KeyCode == Keys.Enter)
    {
        ctl.SelectNextControl(ActiveControl, true, true, true, true);

    }
    else if (e.KeyCode == Keys.Up)
    {
        ctl.SelectNextControl(ActiveControl, false, true, true, true);

    }



}
Run Code Online (Sandbox Code Playgroud)

Han*_*ant 5

您不能使用 KeyPreview 或表单的 KeyDown 事件来执行此操作。这是 VB6 的遗留问题,导航键在触发 KeyDown 之前被拦截。您必须改为重写表单的 ProcessCmdKey() 方法。

一般来说,以这种方式解决问题是相当难看的,它是局部问题的全局解决方案。当您这样做时,您将破坏其他控件,例如 RichTextBox 或多行 TextBox,让您的用户完全困惑为什么他们行为不当。更简洁的方法是创建您自己的 ComboBox 控件,该控件不会吞没光标键。将新类添加到您的项目中并粘贴下面所示的代码。编译。从工具箱顶部放下新控件,替换现有组合。

using System;
using System.Windows.Forms;

class MyComboBox : ComboBox {
    protected override bool IsInputKey(Keys keyData) {
        if ((keyData == Keys.Up) || (keyData == Keys.Down)) return false;
        return base.IsInputKey(keyData);
    }
}
Run Code Online (Sandbox Code Playgroud)