2011-04-12 83 views
2

我有一個多行文本框,它不應該接受字母,數字,換行符(回車鍵)和退格鍵。總之,textbox.Text不應該是可編輯的。但我確實希望文本框接受兩個快捷鍵 - 控制和控制+ R。我可以使文本框不可編輯的一種方法是將其設置爲只讀。但是,文本框不會接受任何按鍵。總之,我的快捷鍵(控制和控制+ R)不會工作(控制+ R)與只讀方法。如何使多行文本框不接受Enter和Backspace

任何人都可以在這方面提供幫助。這就是我必須要做的。

我在這裏可以做的一件事情不是讓文本框爲只讀,然後限制可以在文本框中輸入的字符(字母和數字)。使用此代碼:

private void txtResult_KeyPress(object sender, KeyPressEventArgs e) 
    { 
     // only modifier keys, escape, enter, backspace etc is accepted now 
     e.Handled = !char.IsControl(e.KeyChar); 
    } 

    private void txtResult_KeyDown(object sender, KeyEventArgs e) 
    { 
     if (e.Control == true) 
     { 
      if (e.KeyCode == Keys.R) 
      { 
       // do something 
      } 
      else 
      { 
       //do something 
      } 
     } 

     if (e.KeyCode == Keys.Escape) 
     { 
      //do something 
     } 
    } 

使用此技術,我可以獲得快捷方式(控制和控制+ R)工作。但是這種方法的問題在於Enter和Backspace鍵可以編輯文本框的文本。我如何特別限制從文本框中註冊的Enter和Backspace鍵,但讓Control和Escape?

回答

2

你試過SuppressKeyPress = true

private void textBox2_KeyDown(object sender, KeyEventArgs e) 
     { 
      if (e.Control == true) 
      { 
       if (e.KeyCode == Keys.R) 
       { 
        // do something 
       } 
       else 
       { 
        //do something 
       } 
      } 
      else 
       e.SuppressKeyPress = true; 


     } 
+0

這不處理問題中所要求的Esc鍵。它也不會阻止文本框被修改。由於您沒有指出按鍵的R鍵是「已處理」,文本框控件仍然會將它們視爲輸入,並鍵入字母R. – 2011-04-12 14:09:48

+0

謝謝。工作。我很感激。是的,由於您沒有包含我想要的'Esc'功能,所以我會做這個小調整,就像@Cody Gray所說的那樣。我想我可以編輯你的代碼來包含它。再次感謝。 – nawfal 2011-04-12 15:56:18

+0

@Cody Gray,是的,這種方法是有效的。文本框不會像你想象的那樣得到字母R.是的,我的文本框仍然不是隻讀的。文本框被完全阻止被修改.. – nawfal 2011-04-12 16:06:11

1

由於您正在處理KeyDown事件處理程序中的鍵,爲什麼不讓您的KeyPress處理程序返回所有按鍵處理?

所以,只要設置e.Handled = true就可以了。我相信退格和輸入也會被解釋爲控制字符。

+0

@David Paxson。 你可以給自己的代碼?我不知道該怎麼做 – nawfal 2011-04-12 13:45:31

+0

在'KeyDown'和'KeyPress'中處理按鍵有什麼意義? – 2011-04-12 14:08:32

+0

@Cody Gray,因爲下面的代碼不會在'KeyDown'('KeyDown'沒有'KeyChar'')下工作。 KeyPress下沒有KeyCode或KeyData。希望你得到它.. – nawfal 2011-04-12 15:28:16

0

輸入退格鍵如果文本框設置爲只讀,因爲你在你所做過的問題建議儘早將無法正常工作。確保該屬性仍然設置爲true。你可以將它設置在屬性窗口,或通過像這樣的代碼:

myTextBox.ReadOnly = true; 

然後,你需要處理KeyDown事件TextBox控件,並留意是否有您感興趣的特定按鍵。類似這樣的:

private void myTextBox_KeyDown(object sender, KeyEventArgs e) 
{ 
    if (e.Control) 
    { 
     if (e.KeyCode == Keys.R) 
     { 
     MessageBox.Show("Pressed Ctrl+R"); 
     } 
     else 
     { 
     MessageBox.Show("Pressed Ctrl"); 
     } 
    } 
    else if (e.KeyCode == Keys.Escape) 
    { 
     MessageBox.Show("Pressed Esc"); 
    } 
} 

只要將文本框設置爲只讀,它就會按預期工作。沒有其他鍵被識別,並且用戶不能改變或修改文本框中的任何文本。您不需要禁用按鍵,因爲控件在將其設置爲只讀時已經這樣做了。您也不需要同時處理KeyDownKeyPress事件。 KeyPress無論如何不會爲你工作,因爲它不會讓你處理控制角色。

+0

評論我感謝你切入英寸您的答案之前有幫助。這個代碼的問題是,Contol + R不會工作,因爲總是首先顯示「按下Ctrl」消息。由於「僅」Ctrl已註冊且始終首先註冊,因此無法在此處註冊Ctrl + R。希望你得到它 – nawfal 2011-04-12 15:54:58

+0

@nawfal:對,它不適用於消息框。這僅用於測試目的。但是,如果這對你很重要,它是可以修復的。我剛剛從你的問題中複製了代碼。 – 2011-04-12 15:56:22

+0

是的,沒關係,我可以理解。我知道消息框有點不同。但不知怎的,我想要做的事(執行進程,殺死進程等)也不像在這種情況下那樣執行得像消息框一樣。 'e.SuppressKeyPress'工作正常 – nawfal 2011-04-12 16:03:23