我正在尝试为文本框设置十六进制掩码.这样只能输入有效的十六进制数. (和’,’和’ENTER’)
它几乎可以工作.到目前为止它只允许来自a-f和数字0-9的小写字母,但我仍然可以输入大写字母GHIJKLM. (首先,当程序启动时,它似乎接受了一个char ex k,但是在它之后不会显示k之后,直到下次启动程序.这很奇怪.)
这是代码的一部分:
private void EnterKey(Object sender,System.Windows.Forms.KeyPressEventArgs e) { // if keychar == 13 is the same as check for if <ENTER> was pressed if (e.KeyChar == (char)13) { // is <ENTER> pressed,send button_click button1_Click(sender,e); } { // this will only allow valid hex values [0-9][a-f][A-F] to be entered. See ASCII table char c = e.KeyChar; if (c != '\b' && !((c <= 0x66 && c >= 61) || (c <= 0x46 && c >= 0x41) || (c >= 0x30 && c <= 0x39) || (c == 0x2c))) { e.Handled = true; } } }
这就是我绑定事件的方式:
private void textBox1_TextChanged(object sender,EventArgs e) { this.textBox1.KeyPress += new KeyPressEventHandler(textBox1_KeyDown); }
难道你们这些聪明人,看看我做错了什么?
这是我的第一个小程序,所以对我很轻松:o)
解决方法
这个:
c <= 0x66 && c >= 61
应该:
c <= 0x66 && c >= 0x61 //hex literal
请注意,通过查找十六进制代码会浪费宝贵的时间,您可以轻松地比较字符:
if ((c >= 'a') && (c <= 'f'))
至于第一个字符:你不应该在TextChanged事件中绑定KeyPress – 为时已晚!这是事件的顺序:
>表格载荷
> ……
>用户单击一个键.
>触发TextChanged,更改文本并绑定事件.
>用户单击一个键.
> KeyPress被触发.
你想要做的是从一开始就绑定事件.最好的地方是Form_Load事件.您还可以使用“属性”窗口在设计时绑定事件