2012-01-06 129 views
0

我有一個顯示數組內容的列表框。當我按下「go」按鈕時,數組將填充結果列表。c#Listbox控件(箭頭和輸入鍵)

go按鈕被設置爲表單屬性上的AcceptButton,因此按下表單焦點中任意位置的Enter鍵將重新運行go按鈕處理。

從列表框中內的陣列結果雙擊工作正常使用下:

void ListBox1_DoubleClick(object sender, EventArgs e) {}

我希望能夠用我的方向鍵和enter鍵來選擇,沒有運行事件必須雙擊列表框中的行。 (不過每次都去按鈕運行)

基本打開表單,輸入搜索字符串,按回車鍵運行go按鈕,使用上下箭頭,然後按選擇上面的enter鍵運行同樣的事件,雙擊上面。每一點之後都需要改變焦點。

+0

哪裏是你使用的代碼來捕獲的關鍵事件? – 2012-01-06 14:22:36

+0

只需將代碼放在ListBox1_Click中... – 2012-01-06 14:25:47

回答

6

您可以處理要覆蓋的控件的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; 

您可以在列表框處理Enter按鈕的方式與上面相同的文本框,並調用DoubleClick事件。

+0

感謝您使用mylistbox.focus();在go腳本的末尾,上下箭頭可以循環顯示列表框,但按下enter鍵會重新執行go按鈕。我試圖實現listbox1_keydown()如上所示,但我似乎不能用this.listBox1.keydown + = new System.EventHandler(this.ListBox1_KeyDown)聲明它;因爲它表示沒有超載listobx1_keydown – meeeeeeeeee 2012-01-06 15:07:42

+0

當檢查ListBox中的Enter按鈕時,您需要從上面更改'textbox1_KeyDown'代碼並將'GoButton_Click/GoButtonMethod'替換爲'ListBox1_DoubleClick(ListBox1,null)'。 – keyboardP 2012-01-06 15:09:26

+0

謝謝,我試圖做到這一點,編輯上面的帖子,當我添加代碼並嘗試使用this.listBox1.keydown + = new System.EventHandler(this.ListBox1_KeyDown)聲明; listbox1_keydown沒有超載 – meeeeeeeeee 2012-01-06 15:23:05

2

這個問題類似於 - Pressing Enter Key will Add the Selected Item From ListBox to RichTextBox

,當他們在Control::KeyDown事件按下某些控制不承認某些鍵。對於例如列表框無法識別按下的鍵是否爲輸入鍵。

請參閱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; 
    } 
}