【问题标题】: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);

    }



}

【问题讨论】:

    标签: c# winforms combobox arrow-keys


    【解决方案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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-09
      • 1970-01-01
      • 2021-04-04
      • 1970-01-01
      • 2016-10-07
      相关资源
      最近更新 更多