簡體   English   中英

在KeyDown事件上篩選KeyCodes的更有效方法

[英]More efficient way of screening KeyCodes on KeyDown Event

當用戶嘗試使用KeyDown事件嘗試僅將有用數據輸入到表單字段時,我正在嘗試觸發事件執行某些工作。 但是,我不斷收到錯誤警報,因為KeyDown事件適用於任何密鑰!

我試圖不對“Alt,Control,Shift,Esc,F-key等”按鈕觸發事件。 這樣做的最佳方法是什么?

到目前為止我所擁有的是:

    private void formControl_KeyModified(object sender, KeyEventArgs e)
    {
        if (e.KeyCode != Keys.Shift && e.KeyCode != Keys.CapsLock && e.KeyCode != Keys.Tab && e.KeyCode != Keys.Escape &&
            e.KeyCode != Keys.Insert && e.KeyCode != Keys.Home && e.KeyCode != Keys.End && e.KeyCode != Keys.PageUp &&
            e.KeyCode != Keys.PageDown && e.KeyCode != Keys.Up && e.KeyCode != Keys.Down && e.KeyCode != Keys.Left &&
            e.KeyCode != Keys.Right && e.KeyCode != Keys.Control && e.KeyCode != Keys.Alt && e.KeyCode != Keys.NumLock &&
            e.KeyCode != Keys.Insert && e.KeyCode != Keys.None && e.KeyCode != Keys.PrintScreen && e.KeyCode != Keys.Help &&
            e.KeyCode != Keys.ControlKey && e.KeyCode != Keys.ShiftKey && e.KeyCode != Keys.Sleep && e.KeyCode != Keys.LWin &&
            e.KeyCode != Keys.RWin && e.KeyCode != Keys.RMenu && e.KeyCode != Keys.LMenu && e.KeyCode != Keys.LShiftKey &&
            e.KeyCode != Keys.RShiftKey && e.KeyCode != Keys.Pause && e.KeyCode != Keys.F1 && e.KeyCode != Keys.F2 &&
            e.KeyCode != Keys.F3 && e.KeyCode != Keys.F4 && e.KeyCode != Keys.F5 && e.KeyCode != Keys.F6 && e.KeyCode != Keys.F7 &&
            e.KeyCode != Keys.F8 && e.KeyCode != Keys.F9 && e.KeyCode != Keys.F10 && e.KeyCode != Keys.F11 && e.KeyCode != Keys.F12 &&
            e.KeyCode != Keys.L)
        {
             // Do some work...
        }
    }

但是,這似乎不是解決這個問題的最好方法。 同樣,我只是想獲取可以輸入文本框的字符的鍵 (例如213135udf!@#%@!#@#%15nfaosdf~!@} {:?>,等等)! 任何幫助都將不勝感激,謝謝!

真誠的,艾薩克D.

(編輯清晰度和質量)

您可以將所有值都拋出到HashSet<T>並檢查KeyCode是否在集合中。

var invalidKeys = new HashSet<Keys> { Keys.Shift, Keys.CapsLock, Keys.Tab, ... Keys.L };
if (!invalidKeys.Contains(e.KeyCode))
{
    // Do some work...
}

或者,由於您正在檢查是否相等,您可以將所有內容都拋入switch語句中。

switch (e.KeyCode)
{
case Keys.Shift:
case Keys.CapsLock:
case Keys.Tab:
// ...
case Keys.L:
    break;
default:
    // Do some work...
    break;
}

你可以舉例說(有許多好的嘗試)檢查這個頁面以獲取Char類的幫助,你可以使用像IsLetterOrDigit或其他函數這樣的方法。 現在我無法識別您是否使用Windows窗體? 如果是這樣,使用像(char)e.KeyCode這樣的簡單(char)e.KeyCode來獲取char。

例:

private void formControl_KeyModified(object sender, KeyEventArgs e)
{
    char c = (char)e.KeyCode;
    if (Char.IsLetterOrDigit(c)) {
        // useful
    }
    // might add more checks
    // else if (Char.IsPunctuation(c)) ...
}

您可以處理表單的KeyPress事件。 上述事件將KeyPressEventArgs作為其參數參數。

使用Char.IsLetterOrDigit函數檢查KeyPressEventArgs.KeyChar屬性的值。

private void form_KeyPress(object sender, System.Windows.Forms.KeyPressEventArgs e)
{

     if (char.IsLetterOrDigit(e.KeyChar)) {}
     else { e.Handled = false; }

}

編輯:

您還可以嘗試列出已接受的Char值,然后檢查其中是否包含預置字符:

private void form_KeyPress(object sender, System.Windows.Forms.KeyPressEventArgs e)
{

     List<Char> charList = new List<Char>;
     charList.AddRange(new Char[] { 'a', 'b' ... });

     if (charList.Contains(e.KeyChar)) {}
     else { e.Handled = false; }

}

您可能需要考慮結合兩種方式甚至更多來滿足您的要求。

如果您關心if語句的執行時間,請創建Key值的SortedList並檢查SortedList是否包含您的鍵。

一個可能更好的解決方案是使用Forms TextBox“TextChanged”事件而不是使用KeyDown事件。

就像@Daniel在他的評論中指出的那樣,將有效密鑰列入白名單比將黑名單列入所有那些您不感興趣的密鑰更可取。 因此,如果您只對字母鍵和數字感興趣,那么就可以像在msdn Keys示例中描述的那樣進行操作。

if(e.KeyCode > Keys.NumPad0 && e.KeyCode < Keys.NumPad9 ||
   e.KeyCode > Keys.D0 && e.KeyCode < Keys.D9 ||
   e.KeyCode > Keys.A && e.KeyCode < Keys.Z) {

    //do useful stuff here
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM