【问题标题】:C# textBox Hex only with 0x/h/$ prefix using TextChanged propertyC# textBox Hex 仅带有 0x/h/$ 前缀,使用 TextChanged 属性
【发布时间】:2015-01-17 20:04:13
【问题描述】:

我正在 TextChanged 属性中测试以下代码,以仅允许 textBox 中的 HEX 值,它工作得很好,它还删除了与 HEX 模式不匹配的粘贴字符串并将小写转换为大写,这只是我需要什么:

Regex nonhex = new Regex("[^0-9,a-f,A-F]");
int caret = textBox1.SelectionStart - textBox1.Text.Length;
textBox1.Text = nonhex.Replace(textBox1.Text, "").ToUpper();
textBox1.SelectionStart = caret + textBox1.Text.Length;

如果我尝试添加前缀,上面的代码只会删除它。修改代码以允许添加永久前缀(例如 0x、h、$)以使我只使用正则表达式和 TextChnaged 属性的最佳方法是什么,是否有可能?我还需要能够指定 HEX 值的最大长度,例如 PID 和 VID HID 设备的 4 位,因为我可能会在一些需要或多或少的十六进制数字的不同项目中使用它。

我在论坛中查找了类似的解决方案,但大多数人使用多个事件并且几乎无法实现这四行可以做到的事情。顺便说一句,使用 RegEx 并不是犯罪行为。

谢谢

【问题讨论】:

    标签: c# regex textbox hex prefix


    【解决方案1】:

    你对这四行所做的就是将验证和校正结合起来,这充其量是困难的,而且在许多情况下是不可能的。如果你真的想这样做,你首先必须验证输入。只有当它无效时才应该修改它。

    我建议您创建一个将首先验证的正则表达式,如下所示:

    Regex validInput = new Regex(@"^(\$|h|0x)?[0-9a-f]*", RegexOptions.IgnoreCase);
    if (validInput.IsMatch(textBox1.Text))
    {
        return;
    }
    

    如果您超过了这一点,那么您就会知道该文本在某些方面是不好的。如果你想纠正它,你必须确定它在哪里是坏的。而且你不会用一个正则表达式来做到这一点。您必须确定是否存在有效前缀。如果有 is 是一个有效的前缀,那么您可以检查文本的其余部分,看看它是否是一个有效的十六进制数。如果没有有效前缀,则检查整个字段以查看它是否是有效数字。

    在您确定错误出在哪里之后,您必须修复它。即使在您描述的简单情况下也很难。

    我认为你的做法完全错误。

    基本上有三种处理验证的方法:

    1. 让用户输入他想要的任何文本。您将其标记为不良,但您保持原样并让用户更改它。
    2. 防止用户输入不允许的字符。例如,只允许他在数字输入字段中输入数字。
    3. 当用户输入错误数据时自动更正文本。

    您选择了 #3,这通常是最困难的(正如我在上面所描述的),在我看来,作为用户,这是最烦人的选项。

    你会遇到各种各样的问题。例如,假设用户输入了“01AB”,然后他回到开头并输入“x”,给出“x01AB”。但你不喜欢那样。你想要“0x01AB”,所以你从字符串中删除了“x”。用户想,“嗯。我以为我按下了‘x’。”于是他又试了一次。在他发现您的代码如此“有用”地阻止他输入错误数据之前,他需要尝试两三次。作为一个用户,我觉得这非常烦人,每当我遇到它时,我都想找到编写它的程序员并将他锁起来,这样他就不会再犯这种丑陋了。

    多年来,我发现第一个选项最容易编写代码,并且作为用户,最容易使用。如果用户输入了错误的数据,您可以轻松地验证它并通知用户他犯了一个错误:通常是通过更改输入框周围的边框,在其旁边放置一个错误指示器,并可能显示一些说明输入原因的文本不好以及如何纠正它。使用我上面的例子:

    Regex validInput = new Regex(@"^(\$|h|0x)?[0-9a-f]*", RegexOptions.IgnoreCase);
    if (validInput.IsMatch(textBox1.Text))
    {
        // input is good. Clear errors.
        return;
    }
    // Input is bad. Show error indicator.
    

    现在,如果用户按下“确定”或“保存”按钮或其他任何按钮,但仍有错误数据,您必须抓住它并采取相应措施(即不要让程序继续处理错误数据)。但这比尝试更正用户输入的内容要容易得多,而且也不那么烦人。

    【讨论】:

      猜你喜欢
      • 2014-11-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多