WinForms listbox keydown事件不会触发

时间:2017-03-31 20:21:32

标签: c# winforms listbox keydown eventtrigger

我正在尝试制作一个WinForm ListBox,您可以使用箭头键循环播放。我还有两个按钮,您可以在其中单击以在列表中上下移动。按钮确实产生了所需的效果。问题是ListBox的keyDown事件永远不会被触发

    public MainForm()
    {
        InitializeComponent();
        if (this.clipboardHistoryList.Items.Count > 0)
            this.clipboardHistoryList.SetSelected(0, true);
        clipboardHistoryList.Select();
    }

   private void goUpButton_Click(object sender, EventArgs e)
    {
        goUpList();
    }

    private void goDownButton_Click(object sender, EventArgs e)
    {
        goDownList();
    }

    private void goDownList()
    {
        if (clipboardHistoryList.SelectedIndex == clipboardHistoryList.Items.Count - 1)
        {
            clipboardHistoryList.SetSelected(0, true);
        }
        else
        {
            clipboardHistoryList.SetSelected(clipboardHistoryList.SelectedIndex + 1, true);
        }
    }

    private void goUpList()
    {
        if (clipboardHistoryList.SelectedIndex == 0)
        {
            clipboardHistoryList.SetSelected(clipboardHistoryList.Items.Count - 1, true);
        }
        else
        {
            int l_currentlySelected = clipboardHistoryList.SelectedIndex;
            clipboardHistoryList.SetSelected(l_currentlySelected - 1, true);
        }
    }

    private void clipboardHistoryList_KeyDown(object sender, KeyEventArgs e)
    {
        if (e.KeyCode == Keys.Up)         //Brekpoint is never reached
        {
            goUpList();
        }
        else if (e.KeyCode == Keys.Down)
        {
            goDownList();
        }
    }

我已将MainForm的keypreview属性设为true。

箭头键默认在列表框上工作,但是如果按下最后一个元素上的向下箭头,它们将不允许你从最后一个元素到第一个元素 - 希望这是有道理的。

修改 我在Microsoft's documentation看到我需要覆盖ProcessDialogKey方法,但我不确定我需要做什么。

  

对控件执行特殊输入或导航处理。例如,您希望使用列表控件中的箭头键来更改所选项。覆盖ProcessDialogKey

是否已有内置方法来启用此行为?

我错过了什么?

谢谢!

1 个答案:

答案 0 :(得分:4)

通过查看Designer.cs文件中的代码,看起来您实际上并未将clipboardHistoryList控件连接到clipboardHistoryList_KeyDown事件处理程序中。您可以通过Visual Studio表单设计器的“属性”窗口的“事件”子选项卡(查找小闪电图标)并通过设计器以这种方式连接事件,或者您可以在代码中执行此操作:< / p>

public MainForm()
{
    InitializeComponent();
    if (this.clipboardHistoryList.Items.Count > 0)
        this.clipboardHistoryList.SetSelected(0, true);
    clipboardHistoryList.Select();

    clipboardHistoryList.KeyDown += clipboardHistoryList_KeyDown;
}