用于屏蔽文本框输入的C#十六进制掩码

用于屏蔽文本框输入的C#十六进制掩码,c#,hex,mask,C#,Hex,Mask,我正在尝试为文本框设置十六进制掩码。因此,只能输入有效的十六进制数。(和“,”和“输入”) 它几乎起作用了。到目前为止,它只允许a-f的小写字母和数字0-9,但我仍然可以输入大写字母GHIJKLM。(一开始,当程序启动时,它似乎接受一个字符exk,但在它排除了k之后,它将不会显示,直到下次启动程序。这很奇怪。) 以下是代码的一部分: private void EnterKey(Object sender, System.Windows.Forms.KeyPressEventArgs e) {

我正在尝试为文本框设置十六进制掩码。因此,只能输入有效的十六进制数。(和“,”和“输入”)

它几乎起作用了。到目前为止,它只允许a-f的小写字母和数字0-9,但我仍然可以输入大写字母GHIJKLM。(一开始,当程序启动时,它似乎接受一个字符exk,但在它排除了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;
        }
    }
}
你们这些聪明人中有谁能看出我做错了什么

这是我的第一个小程序,所以对我放轻松: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");
                }
            }
        }
    }