用于屏蔽文本框输入的C#十六进制掩码
我正在尝试为文本框设置十六进制掩码。因此,只能输入有效的十六进制数。(和“,”和“输入”) 它几乎起作用了。到目前为止,它只允许a-f的小写字母和数字0-9,但我仍然可以输入大写字母GHIJKLM。(一开始,当程序启动时,它似乎接受一个字符exk,但在它排除了k之后,它将不会显示,直到下次启动程序。这很奇怪。) 以下是代码的一部分:用于屏蔽文本框输入的C#十六进制掩码,c#,hex,mask,C#,Hex,Mask,我正在尝试为文本框设置十六进制掩码。因此,只能输入有效的十六进制数。(和“,”和“输入”) 它几乎起作用了。到目前为止,它只允许a-f的小写字母和数字0-9,但我仍然可以输入大写字母GHIJKLM。(一开始,当程序启动时,它似乎接受一个字符exk,但在它排除了k之后,它将不会显示,直到下次启动程序。这很奇怪。) 以下是代码的一部分: private void EnterKey(Object sender, System.Windows.Forms.KeyPressEventArgs e) {
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;
}
}
}
你们这些聪明人中有谁能看出我做错了什么
这是我的第一个小程序,所以对我放轻松:o)这:
c <= 0x66 && c >= 61
c=61
应该是:
c <= 0x66 && c >= 0x61 //hex literal
c=0x61//十六进制文字
请注意,查找十六进制代码是在浪费宝贵的时间,您可以轻松地比较字符:
if ((c >= 'a') && (c <= 'f'))
if((c>='a')&&(c如果您没有使用幻数,您将永远不会遇到此问题。请像这样重写if
:
if (!(c == '\b' || ('0' <= c && c <= '9') || ('A' <= c && c <= 'F') // et cetera
if(!(c=='\b'||)('0'这是一个ASP.NET网站还是某种类型的winforms/wpf厚客户端的程序类型?我问的原因是您可能正在测试过时的代码。否则,更改时只需翻转检查逻辑,使其与您想要的更加一致。确保输入的字符是允许集合中的一个元素。重构是b私奔
e、 Handled=(c>=0x61&&c=0x41&&c=0x30&&c使用正则表达式:
using System.Text.RegularExpressions;
...
if (!(Regex.IsMatch(e.KeyChar.ToString(), "^[0-9a-fA-F]+$"))
e.Handled = true;
为什么要把它复杂化
private void EnterKey(Object sender, System.Windows.Forms.KeyPressEventArgs e)
{
char c = e.KeyChar;
e.Handled = !System.Uri.IsHexDigit(e.KeyChar) && c != 0x2C;
}
private void textBox1\u按键(对象发送器,按键事件参数e){
/*小于0或大于9,以及
*小于a或大于f,以及
*小于A或大于F,以及
*不是退格,还有
*not delete或decimal(与delete键相同)*/
如果(
((e.KeyChar<48)| |(e.KeyChar>57))&&
((e.KeyChar<65)| |(e.KeyChar>70))&&
((e.KeyChar<97)| |(e.KeyChar>102))&&
(e.KeyChar!=(char)Keys.Back)&&
((e.KeyChar!=(char)Keys.Delete)| |(e.KeyChar=='。)
)e.已处理=正确;
}
基于Kobi对WPF的回答
private void EnterKey(Object sender, KeyEventArgs e)
{
Key c = e.Key;
if (!((c >= Key.A) && (c <= Key.F)))
{
if (!((c >= Key.D0) && (c <= Key.D9)))
{
if (!((c >= Key.NumPad0) && (c <= Key.NumPad9)))
{
e.Handled = true;
LogText("Handled");
}
}
}
}
private void EnterKey(对象发送方,KeyEventArgs e)
{
键c=e。键;
如果(!((c>=Key.A)和&(c=Key.D0)和&(c=Key.NumPad0)和&(c)老实说,一个正则表达式对于这个问题来说太难了,向新程序员建议一个正则表达式是一种边缘犯罪:)
这看起来比我以前的解决方案要好得多。但在程序启动后输入第一个字符时,我仍然存在问题。它似乎可以接受任何东西,但只能接受第一个字符。我认为问题出现在我以前的解决方案中,因为查找十六进制代码浪费了宝贵的时间。但是当使用正则表达式我也看到了这个问题。有什么想法吗?我几乎可以肯定这个问题与此解决方案无关…也许我们需要更多的信息来了解发生了什么。键盘上的数字无法识别。请修复。关于第一次按键的部分没有多大意义。如何绑定事件?是否尝试使用键own
event?我是从输入框中完成的:private void textBox1_TextChanged(object sender,EventArgs e){this.textBox1.KeyPress+=new System.Windows.Forms.KeyPressEventHandler(textBox1_KeyDown);}非常优雅。但是你能为noobs简化它吗?我不需要它,只是为了将来的参考。
private void EnterKey(Object sender, System.Windows.Forms.KeyPressEventArgs e)
{
char c = e.KeyChar;
e.Handled = !System.Uri.IsHexDigit(e.KeyChar) && c != 0x2C;
}
private void textBox1_KeyPress(object sender, KeyPressEventArgs e) {
/* less than 0 or greater than 9, and
* less than a or greater than f, and
* less than A or greater than F, and
* not backspace, and
* not delete or decimal (which is the same key as delete). */
if (
((e.KeyChar < 48) || (e.KeyChar > 57)) &&
((e.KeyChar < 65) || (e.KeyChar > 70)) &&
((e.KeyChar < 97) || (e.KeyChar > 102)) &&
(e.KeyChar != (char)Keys.Back) &&
((e.KeyChar != (char)Keys.Delete) || (e.KeyChar == '.'))
) e.Handled = true;
}
private void EnterKey(Object sender, KeyEventArgs e)
{
Key c = e.Key;
if (!((c >= Key.A) && (c <= Key.F)))
{
if (!((c >= Key.D0) && (c <= Key.D9)))
{
if (!((c >= Key.NumPad0) && (c <= Key.NumPad9)))
{
e.Handled = true;
LogText("Handled");
}
}
}
}