【问题标题】:c# Listbox control (arrows and enter keys)c# Listbox控件(箭头和回车键)
【发布时间】:2012-01-06 14:19:29
【问题描述】:

我有一个显示数组内容的列表框。当我的“开始”按钮被按下时,数组中会填充一个结果列表。

开始按钮在表单属性中设置为 AcceptButton,因此在表单焦点的任意位置按 Enter 键会重新运行开始按钮进程。

双击列表框中数组的结果可以正常使用:

void ListBox1_DoubleClick(object sender, EventArgs e) {}

我希望能够使用箭头键和输入键来选择和运行事件,而无需双击列表框中的行。 (但是 go 按钮每次都会运行)

基本上打开表单,输入搜索字符串,按回车键运行 go 按钮,使用向上和向下箭头,然后在选择时按回车键运行与上面双击相同的事件。需要在每一位之后改变焦点。

【问题讨论】:

  • 您用来捕获关键事件的代码在哪里?
  • 把代码放到ListBox1_Click...

标签: c# listbox


【解决方案1】:

您可以为要覆盖的控件处理KeyDown 事件。例如,

private void textBox1_KeyDown(object sender, KeyEventArgs e)
{
    if (e.KeyCode == Keys.Enter)
    {
        //execute go button method
        GoButtonMethod();
        //or if it's an event handler (should be a method)
        GoButton_Click(null,null);
    }

}

这将执行搜索。然后你可以聚焦你的列表框

myListBox.Focus();
//you might need to select one value to allow arrow keys
myListBox.SelectedIndex = 0;

ListBox中Enter按钮的处理方式和上面TextBox一样,调用DoubleClick事件。

【讨论】:

  • 谢谢你,我已经使用了 mylistbox.focus();在 go 脚本的末尾,因此向上和向下箭头可以在列表框中循环,但按 Enter 只会重新运行 go 按钮。我已尝试如上所示实现 listbox1_keydown() 但我似乎无法用 this.listBox1.keydown += new System.EventHandler(this.ListBox1_KeyDown); 声明它因为它说 listobx1_keydown 没有过载
  • 在列表框中检查Enter 按钮时,您需要更改上面的textbox1_KeyDown 代码并将GoButton_Click/GoButtonMethod 替换为ListBox1_DoubleClick(ListBox1,null)
  • 谢谢,我正在尝试这样做并编辑上面的帖子,当我添加代码并尝试使用 this.listBox1.keydown += new System.EventHandler(this.ListBox1_KeyDown); 声明时listbox1_keydown 没有过载
  • “ListBox1_KeyDown”没有重载匹配委托“System.EventHandler”
  • 它有一个 KeyDown 事件。 msdn.microsoft.com/en-us/library/…listBox1.KeyDown += new KeyEventHandler(listBox1_KeyDown);
【解决方案2】:

这个问题类似于 - Pressing Enter Key will Add the Selected Item From ListBox to RichTextBox

某些控件在Control::KeyDown 事件中按下时无法识别某些键。例如如果按下的键是 Enter 键,列表框无法识别。

请参阅Control::KeyDown 事件参考的备注部分。

解决问题的一种方法可能是为列表框控件的Control::PreviewKeyDown 事件编写方法:

private void listBox1_KeyDown(object sender, KeyEventArgs e)
{
    if (e.KeyCode == Keys.Up && this.listBox1.SelectedIndex - 1 > -1)
    {
        //listBox1.SelectedIndex--;
    }
    if (e.KeyCode == Keys.Down && this.listBox1.SelectedIndex + 1 < this.listBox1.Items.Count)
    {
        //listBox1.SelectedIndex++;
    }
    if (e.KeyCode == Keys.Enter)
    {
        //Do your task here :)
    }
}

private void listBox1_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e)
{
    switch (e.KeyCode)
    {
        case Keys.Enter:
            e.IsInputKey = true;
            break;
    }
}

【讨论】:

    猜你喜欢
    • 2010-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-13
    • 1970-01-01
    • 2021-11-30
    • 2015-05-23
    相关资源
    最近更新 更多