C# WinForms listbox按键关闭事件获胜';t火

C# WinForms listbox按键关闭事件获胜';t火,c#,winforms,listbox,keydown,eventtrigger,C#,Winforms,Listbox,Keydown,Eventtrigger,我正在尝试制作一个WinForm列表框,您可以在其中使用箭头键进行循环。我还有两个按钮,你可以在上面点击上下列表。按钮确实能产生所需的效果。问题是列表框的keyDown事件从未触发 public MainForm() { InitializeComponent(); if (this.clipboardHistoryList.Items.Count > 0) this.clipboardHistoryList.SetS

我正在尝试制作一个WinForm列表框,您可以在其中使用箭头键进行循环。我还有两个按钮,你可以在上面点击上下列表。按钮确实能产生所需的效果。问题是列表框的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

默认情况下,箭头键在列表框中起作用,但如果在最后一个元素上按向下箭头,箭头键将不允许从最后一个元素转到第一个元素,希望这是有意义的

编辑 我已经看到我需要重写
ProcessDialogKey
方法,但我不确定我需要做什么

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

是否已经有一种内置的方式来启用此行为

我错过了什么


谢谢

通过查看Designer.cs文件中的代码,看起来您并没有将clipboardHistoryList控件连接到clipboardHistoryList\u KeyDown事件处理程序中。您可以通过visual studio表单设计器中属性窗口的“事件”子选项卡(查找小闪电图标)完成此操作,并通过设计器以这种方式连接事件,或者您也可以通过代码完成此操作:

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

    clipboardHistoryList.KeyDown += clipboardHistoryList_KeyDown;
}

通过查看Designer.cs文件中的代码,看起来您并没有将clipboardHistoryList控件连接到clipboardHistoryList\u KeyDown事件处理程序中。您可以通过visual studio表单设计器中属性窗口的“事件”子选项卡(查找小闪电图标)完成此操作,并通过设计器以这种方式连接事件,或者您也可以通过代码完成此操作:

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

    clipboardHistoryList.KeyDown += clipboardHistoryList_KeyDown;
}


您是否100%确定ListBox实际上已连接到事件处理程序中?当我创建一个带有列表框的表单时,它会在每次使用箭头键时正确地触发KeyDown事件。我建议您在Designer.cs文件中查找表单,并验证是否可以找到与此类似的行,它实际上连接到事件:this.listBox1.KeyDown+=new System.Windows.Forms.keydeventhandler(this.listBox1\u KeyDown);列表框没有焦点,或者您没有连接事件
我已将主窗体的keydown属性设置为true。
你是说keydeview吗?@JoeIrby我在Form1.Designer.cs文件中没有看到类似的行。我用这个文件的内容更新了这个问题。@LarsTech我的意思是你必须连接你的事件。注意你的按钮是如何在设计器中连接事件的,但是你的列表框却没有。你是否100%确定你的列表框实际上连接到了事件处理程序中?当我创建一个带有列表框的表单时,它会在每次使用箭头键时正确地触发KeyDown事件。我建议您在Designer.cs文件中查找表单,并验证是否可以找到与此类似的行,它实际上连接到事件:this.listBox1.KeyDown+=new System.Windows.Forms.keydeventhandler(this.listBox1\u KeyDown);列表框没有焦点,或者您没有连接事件
我已将主窗体的keydown属性设置为true。
你是说keydeview吗?@JoeIrby我在Form1.Designer.cs文件中没有看到类似的行。我用这个文件的内容更新了这个问题。@LarsTech我的意思是你必须连接你的事件。注意你的按钮是如何在设计器中连接事件的,但是你的列表框没有。谢谢你,现在事件被正确触发了!但我现在面临另一个问题。。。每次按下箭头时,光标都会移动两行,就好像keydown事件是由我的方法和默认组件的方法处理的一样。如何修复此问题?您需要添加e.handled=true;感谢您的新事件处理程序。非常感谢,它已修复@Gaboik1事实上,一个事件可能会意外连接两次,在这种情况下,它会被调用两次,就像你正在经历的那样。如果您将我的代码行添加到MainForm()构造函数中,并且还通过设计器连接到事件中,那么可能就是这样。你只需要做一个或另一个(你的选择),而不是两个都做。@JoeIrby-Hm这很有趣,因为我只把它连接到设计器文件中,它仍然被调用了两次。将事件的handled属性设置为true解决了这一问题。正因为如此,现在事件被正确触发了!但我现在面临另一个问题。。。每次按下箭头时,光标都会移动两行,就好像keydown事件是由我的方法和默认组件的方法处理的一样。如何修复此问题?您需要添加e.handled=true;感谢您的新事件处理程序。非常感谢,它已修复@Gaboik1事实上,一个事件可能会意外连接两次,在这种情况下,它会被调用两次,就像你正在经历的那样。如果您将我的代码行添加到MainForm()构造函数中,并且还通过设计器连接到事件中,那么可能就是这样。你只需要做一个或另一个(你的选择),而不是两个都做。@JoeIrby-Hm这很有趣,因为我只把它连接到设计器文件中,它仍然被调用了两次。将事件的handled属性设置为true可解决此问题