2014-07-05 105 views
1

當我按下向上/向下箭頭對tabstop屬性設置爲true的每個控件,然後選擇PREVOIUS/NEXT tabindex。它工作正常,但當組合框是集中它更改它的值導致它被困箭頭了。按下箭頭鍵跳轉組合框

如何在不將按鍵發送到ComboBox的情況下實現tabindex跳轉?它處理的tabindex跳

代碼:

private void ParentForm_KeyDown(object sender, KeyEventArgs e) 
    { 
    Control ctl; 
    ctl = (Control)sender; 
    if (e.KeyCode == Keys.Down || e.KeyCode == Keys.Enter) 
    { 
     ctl.SelectNextControl(ActiveControl, true, true, true, true); 

    } 
    else if (e.KeyCode == Keys.Up) 
    { 
     ctl.SelectNextControl(ActiveControl, false, true, true, true); 

    } 



} 

回答

4

你不能用KeyPreview或表單的KeyDown事件來做到這一點。這是VB6的遺留問題,導航鍵在他們解僱KeyDown之前被攔截。您必須改寫表單的ProcessCmdKey()方法。

通過這種方式解決問題通常是相當醜陋的,它是一個局部問題的全局解決方案。當你這樣做時,你會破壞其他控件,比如RichTextBox或者多行文本框,例如,讓你的用戶完全陷入爲什麼他們行爲不端。更簡潔的方法是創建您自己的ComboBox控件,該控件不會吞下光標鍵。爲您的項目添加一個新類並粘貼下面顯示的代碼。編譯。從工具箱的頂部放下新的控件,替換現有的組合。

using System; 
using System.Windows.Forms; 

class MyComboBox : ComboBox { 
    protected override bool IsInputKey(Keys keyData) { 
     if ((keyData == Keys.Up) || (keyData == Keys.Down)) return false; 
     return base.IsInputKey(keyData); 
    } 
} 
+0

太棒了,謝謝你的解釋。有用!我將使用這種方法來處理每個這樣的控制(雙輸入,整數輸入)。 –

0

必須KeyPreview屬性設置您的形式true

所以你的形式確定是否爲它控制鍵盤事件與形式註冊