6

我正在尝试为文本框设置十六进制掩码。这样只能输入有效的十六进制数字。(和 ',' 和 'ENTER')

它几乎可以工作。到目前为止,它只允许来自 af 和数字 0-9 的小写字母,但我仍然可以输入大写字母 GHIJKLM。(起初,当程序启动时,它似乎接受一个字符 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)

4

7 回答 7

7

这:

c <= 0x66 && c >= 61 

应该:

c <= 0x66 && c >= 0x61 //hex literal

请注意,查找十六进制代码是在浪费宝贵的时间,您可以轻松比较字符:

if ((c >= 'a') && (c <= 'f'))

至于第一个字符:你不应该绑定KeyPressatTextChanged事件 - 为时已晚!以下是事件的顺序:

  1. 表单加载
  2. ...
  3. 用户单击一个键。
  4. TextChanged 触发,更改文本并绑定事件。
  5. 用户单击一个键。
  6. 按键触发。

您要做的是从一开始就绑定事件。最好的地方是Form_Load活动。
您还可以使用“属性”窗口在设计时绑定事件

于 2010-07-26T18:57:04.530 回答
3

如果你没有使用幻数,你永远不会遇到这个问题。像这样重写你的if

if (!(c == '\b' || ('0' <= c && c <= '9') || ('A' <= c && c <= 'F') // et cetera
于 2010-07-26T18:59:31.247 回答
2

使用正则表达式:

using System.Text.RegularExpressions;

...

if (!(Regex.IsMatch(e.KeyChar.ToString(), "^[0-9a-fA-F]+$"))
     e.Handled = true;
于 2010-07-26T19:13:47.177 回答
0

这是什么类型的程序,这是一个 ASP.NET 网站还是某种类型的 winforms/wpf 胖客户端?我问的原因是您可能正在测试陈旧的代码。否则,更改可能只是翻转检查逻辑以更符合您的要求。确保输入的字符是允许集中的一个元素。重构如下。

e.Handled = (c >= 0x61 && c <=0x66) || (c >=0x41 && c<= 0x46) || (c >= 0x30 && c <= 0x39);

作为一种替代方法,如果您只想一次验证整个文本框,而不是在每次按下按键后,您只需解析该值以查看它是否为数字。以下代码片段将从 AF453d 生成解析值 11486525。如果数字不是有效的十六进制值,则 isHex 的结果将为假;

int i;
string s = "AF453d";
bool isHex;
isHex = int.TryParse(s, System.Globalization.NumberStyles.AllowHexSpecifier, null, out i);
Console.WriteLine(isHex);
Console.WriteLine(i);
于 2010-07-26T19:01:08.717 回答
0

为什么要复杂化?

    private void EnterKey(Object sender, System.Windows.Forms.KeyPressEventArgs e)
    {
        char c = e.KeyChar;
        e.Handled = !System.Uri.IsHexDigit(e.KeyChar) && c != 0x2C;
    }
于 2011-10-14T22:35:08.050 回答
0
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;
}
于 2012-06-23T09:44:38.823 回答
0

基于 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");
                }
            }
        }
    }

捕获字母、数字和键盘数字。

于 2013-03-16T13:16:58.650 回答