C#十六进制面膜MaskedTextBox中输入

我想设置一个十六进制掩码文本框。 因此,只有有效的十六进制数字可以进入。 (和“,”与“ENTER”键)

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

作为第一个字符:你不应该绑定KeyPressTextChanged事件-这是为时已晚! 以下是事件序列:

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

什么,你想要做的就是将事件从一开始就绑定。 最好的地方是Form_Load事件。
您还可以使用属性窗口要绑定的事件在设计时:

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

if (!(c == '\b' || ('0' <= c && c <= '9') || ('A' <= c && c <= 'F') // et cetera

使用正则表达式:

using System.Text.RegularExpressions;

...

if (!(Regex.IsMatch(e.KeyChar.ToString(), "^[0-9a-fA-F]+$"))
e.Handled = true;

什么类型的程序,这是一个ASP.NET网站或者某种类型的WinForms的/ WPF的胖客户端? 我想问的原因是,你可能会测试上陈旧的代码。 否则,在变化可以只翻转检查逻辑要多与你想要的东西一致。 确保输入的字符是在允许的组中的一个元件。 重构如下。

e.Handled =(C> = 0x61 &&ç<= 0x66)|| (C> = 0×41 &&ç<= 0×46)|| (C> =为0x30 &&ç<= 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);

为什么要复杂化呢?

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;
}

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

捕捉字母,数字和小键盘数字。

分类:C# 时间:2015-03-15 人气:0
本文关键词: C#,内六角,面具
分享到:

相关文章

Copyright (C) 55228885.com, All Rights Reserved.

55228885 版权所有 京ICP备15002868号

processed in 0.527 (s). 10 q(s)