处理winform文本框上的箭头键事件而不覆盖

时间:2015-01-23 13:28:15

标签: c# winforms textbox keyevent

我遇到的情况是我提供了一个WinForms TextBox实例,我想将自动完成功能附加到。

我已经找到了自动完成功能(字符串匹配+下拉列表),但到目前为止它仍然可靠。

使用键盘导航下拉列表的能力是什么(这种UI的标准就是这样)。

自然的解决方案是处理文本框的KeyDown(或某些事件)事件并相应地在下拉列表中移动选择。

但是,要执行此操作,您需要覆盖IsInputKey()事件以允许捕获箭头键事件。另一种方法是覆盖ProcessCmdKey()并在那里处理事件。这两个问题是我无法覆盖任何内容,因为我无法替换文本框实例。

编辑:假设我有以下代码:

void _textBox_KeyDown(object sender, KeyEventArgs e)
{
    if (_dropdown.Visible)
    {
        // TODO The stuff below fails because we need to either handle ProcessCmdKey or override IsInputKey
        switch (e.KeyCode)
        {
            case Keys.Tab:
                {
                    // click selected item
                    _dropdown.Items[GetSelectedItemIndex()].PerformClick();
                    break;
                }
            case Keys.Down:
                {
                    // select next (or first) item
                    int i = GetSelectedItemIndex() + 1;
                    if (i >= _dropdown.Items.Count) i = 0;
                    _dropdown.Items[i].Select();
                    break;
                }
            case Keys.Up:
                {
                    // select previous (or last) item
                    int i = GetSelectedItemIndex() - 1;
                    if (i < 0) i = _dropdown.Items.Count - 1;
                    _dropdown.Items[i].Select();
                    break;
                }
        }
    }
}

上面代码的问题在于从未调用。该事件永远不会触发箭头键。更多信息:Up, Down, Left and Right arrow keys do not trigger KeyDown event

2 个答案:

答案 0 :(得分:0)

我希望我没有理解你,但这是一个解决方案:

private void Form1_KeyDown(object sender, KeyEventArgs e)
{
    if (e.KeyCode == Keys.Down)
    {
         // Place logic for textbox here
    }
}

我在表单上使用KeyDown事件,然后将keycode与Keys.Down键码进行比较

无效

见这里:Up, Down, Left and Right arrow keys do not trigger KeyDown event

答案 1 :(得分:0)

我可能不完全理解你的问题,但不会像这样的工作吗?

private void textBox1_KeyDown(object sender, KeyEventArgs e)
{
    comboBox1.Text = //results of your matching algorithm.
}

private void textBox1_Validated(object sender, EventArgs e)
{
    textBox1.Text = (string) comboBox1.Text;
}