按下箭头键时跳转组合框

Posted

技术标签:

【中文标题】按下箭头键时跳转组合框【英文标题】:Jump ComboBox on Arrow key pressed 【发布时间】:2014-07-05 09:29:59 【问题描述】:

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

    




【问题讨论】:

【参考方案1】:

您不能使用 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);
    

【讨论】:

太棒了,谢谢你的解释。有用!我将对每个以这种方式运行的控件(双输入、整数输入)使用这种方法。【参考方案2】:

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

因此您的表单确定其上的控件的键盘事件是否在表单中注册

【讨论】:

以上是关于按下箭头键时跳转组合框的主要内容,如果未能解决你的问题,请参考以下文章

按下 Enter 并删除内容时,组合框会擦除建议

datagridview中的组合框,按键旋转[重复]

过滤或跳转到组合框中的值

C#组合框控件ComboBox

Microsoft Access 组合框箭头隐藏的矩形再次出现

在组合框中使用向下/向上箭头键选择数据而不更新数据,直到点击选项卡或输入 MS Access