2011-04-12 80 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