我遇到的情况是我提供了一个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
答案 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;
}