WinForms 列表框 keydown 事件不会触发
WinForms listbox keydown event won't fire
我正在尝试制作一个 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
方法,但我不确定我需要做什么。
Perform special input or navigation handling on a control. For example, you want the use of arrow keys in your list control to change the selected item. Override ProcessDialogKey
是否已经有内置方法来启用此行为?
我错过了什么?
谢谢!
通过查看 Designer.cs 文件中的代码,您似乎并没有将 clipboardHistoryList 控件连接到 clipboardHistoryList_KeyDown 事件处理程序。您可以通过 visual studio 表单设计器中属性 window 的 "Events" 子选项卡(寻找小闪电图标)并以这种方式通过设计器连接事件,或者或者你可以在代码中做到这一点:
public MainForm()
{
InitializeComponent();
if (this.clipboardHistoryList.Items.Count > 0)
this.clipboardHistoryList.SetSelected(0, true);
clipboardHistoryList.Select();
clipboardHistoryList.KeyDown += clipboardHistoryList_KeyDown;
}
我正在尝试制作一个 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
方法,但我不确定我需要做什么。
Perform special input or navigation handling on a control. For example, you want the use of arrow keys in your list control to change the selected item. Override ProcessDialogKey
是否已经有内置方法来启用此行为?
我错过了什么?
谢谢!
通过查看 Designer.cs 文件中的代码,您似乎并没有将 clipboardHistoryList 控件连接到 clipboardHistoryList_KeyDown 事件处理程序。您可以通过 visual studio 表单设计器中属性 window 的 "Events" 子选项卡(寻找小闪电图标)并以这种方式通过设计器连接事件,或者或者你可以在代码中做到这一点:
public MainForm()
{
InitializeComponent();
if (this.clipboardHistoryList.Items.Count > 0)
this.clipboardHistoryList.SetSelected(0, true);
clipboardHistoryList.Select();
clipboardHistoryList.KeyDown += clipboardHistoryList_KeyDown;
}