2012-04-19 52 views
1

我試圖阻止用戶在按鍵事件中輸入單引號。看起來像一個簡單的事情。我只需要與KeyChar合作。當我轉換爲char並與Keys.Right進行比較(右箭頭)時,由於一些奇怪的原因,單引號是匹配的。我對此感到困惑。任何想法,爲什麼一個單引號將是一個右箭頭匹配?我看到的所有例子都只是做這個相同的演員來比較鍵。C#Winforms Keys.Right顯示等於單引號?

Func<char, bool> IsEditingKey = k => 
      { 
       if (k == (char)Keys.Left || k == (char)Keys.Right || k == (char)Keys.Delete || k == (char)Keys.Back) 
       { 
        return true; 
       } 

       return false; 
      }; 

如果我傳入單引號('),當k ==(char)Keys.Right測試發生時,它會返回true。我現在可能是一個演員問題,但我會如何比較以確保它確實是正確的箭頭而不是單引號(')?

回答

3

你正在混合字符與虛擬鍵。不是一回事。 Keys.Right的值爲0x27。 '\''也是0x27。一個是枚舉,另一個是char。

您需要使用適當的事件來區分這兩者。 KeyDown事件爲您提供虛擬鍵。 KeyPress事件爲您提供了鍵入字符,這是在虛擬鍵由用戶的首選鍵盤佈局轉換後生成的。由於您只對字符感興趣,而不是虛擬鍵,所以您必須使用KeyPress。設置e.Handled = true以禁止它。

+0

謝謝!我最初嘗試了keydown,但是在我使用的infragistics控件中存在一些bug,其中e.handled = true並沒有壓制它。當我在按鍵事件上做它,而不是由於某種原因它的工作。 – KingOfHypocrites 2012-04-20 01:52:36

+1

這是因爲KeyDown的e.Handled不抑制按鍵。 e.SuppressKeyPress屬性。 – 2012-04-20 01:57:54

3

使用此轉換從Keyschar

KeysConverter kc = new KeysConverter(); 
char c = Convert.ToChar(kc.ConvertToString(Keys.Left)))); 
+0

謝謝!我會給這個鏡頭。 :) – KingOfHypocrites 2012-04-20 01:54:15

+0

KeysConverter僅適用於在快捷鍵擊鍵的菜單中生成幫助字符串。 – 2012-04-20 09:30:11

0

相反的按鍵事件,嘗試keydown事件。這使用KeyEventArgs這是你正在尋找。

textBox1.KeyDown += new KeyEventHandler(textBox1_KeyDown); 

void textBox1_KeyDown(object sender, KeyEventArgs e) 
    { 
     if (e.KeyCode == Keys.Right) 
     { 
     //Do Something 
     } 
    } 
+0

我正在使用的infragstics控件存在一個錯誤,這就是爲什麼我沒有使用KeyDown。出於某種原因,在按鍵中處理爲true的設置會抑制它,但不會在keydown中(應該可以工作,但不會)。 – KingOfHypocrites 2012-04-20 01:53:35