当 TextBox 获得焦点而不移动光标时,使用 Up/Down 键滚动 ListBox

Use Up/Down keys to scroll a ListBox when a TextBox has focus without moving cursor

我有一个 TextBox 供用户输入搜索词,还有一个 ListBox 用于显示结果。还有一个按钮将根据单击时选择的项目显示一些信息。

我正在尝试使用向上和向下箭头键滚动列表框,这样用户就不必依次单击项目和按钮。那时我还不如只依靠双击事件来完成工作,因为它们已经在项目上了。但是,我正在努力使它更 "keyboard only friendly".
以下代码有效,但有一个小缺陷:

private void txtSearchTerm_KeyDown(object sender, KeyEventArgs e)
{
    if (e.KeyCode == Keys.Down && Results.SelectedIndex < (Results.Items.Count - 1))
    {
        Results.SelectedIndex++;
    }
    else if (e.KeyCode == Keys.Up && Results.SelectedIndex > 0)
    {
        Results.SelectedIndex--;
    }
}  

使用此代码,光标仍会随着所选项目的变化而左右移动。我希望它保持原样(而不是强迫它结束)。我在 txtSearchTerm.Select(...) 活动中没有任何运气,但我想我可能错过了一些东西......

有一个 TextChanged 事件,但它只调用我编写的搜索函数,该函数会在用户键入时填充列表框,因此为简单起见,我将省略该代码。

我是不是遗漏了什么或忽略了一些方法来使这个 TextBox/ListBox 组合功能如我所愿?

快速说明:如果您曾经使用过 UltraEdit,我基本上是在尝试模仿该配置的行为 window。

您应该使用 e.Handled = true; 使用您处理的密钥取消:

private void txtSearchTerm_KeyDown(object sender, KeyEventArgs e)
{
    if (e.KeyCode == Keys.Down)
    {
        if (Results.SelectedIndex < (Results.Items.Count - 1))
            Results.SelectedIndex++;
        e.Handled = true;
    }
    else if (e.KeyCode == Keys.Up)
    {
        if (Results.SelectedIndex > 0)
            Results.SelectedIndex--;
        e.Handled = true;
    }
}

如果键是 Keys.DownKeys.Up,我设置 e.Handled = true;,而不考虑 SelectedIndex 以完全禁用使用这些键移动插入符号。