按箭头键跳转ComboBox

时间:2014-07-05 09:30:00

标签: c# winforms combobox arrow-keys

当我在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);

    }



}

2 个答案:

答案 0 :(得分:4)

您无法使用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);
    }
}

答案 1 :(得分:0)

您必须将表单KeyPreview设置为true

因此,您的表单会确定其上的控件的键盘事件是否以

形式注册