【发布时间】:2017-03-31 20:21:31
【问题描述】:
我正在尝试制作一个 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
是否已经有一种内置方法可以启用此行为?
我错过了什么?
谢谢!
【问题讨论】:
-
您是否 100% 确定您的 ListBox 实际上已连接到您的事件处理程序?当我创建一个带有 ListBox 的表单时,每次使用箭头键时它都会正确触发 KeyDown 事件。我建议查看您的表单的 Designer.cs 文件,并验证您是否可以找到与此类似的行,它实际上连接到事件中:this.listBox1.KeyDown += new System.Windows.Forms.KeyEventHandler( this.listBox1_KeyDown);
-
ListBox 要么没有焦点,要么你没有连接事件。
I have put the MainForm's keydown proprety to true.你是说 KeyPreview 吗? -
@JoeIrby 我在我的 Form1.Designer.cs 文件中看不到任何类似的行。我用这个文件的内容更新了问题。
-
@LarsTech 我的意思是keypreview
-
你必须连接你的事件。请注意您的按钮如何在设计器中连接事件,但您的 ListBox 没有。
标签: c# winforms listbox keydown eventtrigger