跳跃组合框上按箭头键

本文关键字:组合 跳跃 | 更新日期: 2023-09-27 18:11:28

当我按向上/向下箭头在每个控件上有tabstop属性设置为true,然后 previous/NEXT tabindex被选中。它工作得很好,但是当ComboBox聚焦时,改变了它的值,因为它也捕获了箭头。

如何实现表索引跳转而不发送击键到组合框?

处理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);
    }

}

跳跃组合框上按箭头键

你不能在KeyPreview或表单的KeyDown事件中这样做。那是VB6遗留下来的,导航键在按下按键前就被拦截了。您必须重写表单的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);
    }
}

您必须将表单的KeyPreview属性设置为true

所以你的表单决定控件的键盘事件是否注册到表单