Шестнадцатеричная Маска C# для maskedtextbox вводится

Я пытаюсь установить шестнадцатеричную маску для текстового поля. Так, чтобы только допустимые шестнадцатеричные номера могли быть введены. (И'', и 'ВХОДЯТ'),

Это почти работает. До сих пор это только позволит строчные буквы от a-f и номеров 0-9, но я могу все еще ввести прописные буквы GHIJKLM. (Сначала, когда программа запущена, это, кажется, принимает один символ исключая 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)

6
задан Kobi 27 July 2010 в 16:16
поделиться

4 ответа

Это:

c <= 0x66 && c >= 61 

Должно быть:

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

Обратите внимание, что вы тратите драгоценное время, просматривая шестнадцатеричные коды, вы можете легко сравнивать символы:

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

Что касается первого символа: вы не должны связывать Нажатие клавиши в событии TextChanged - уже слишком поздно! Вот последовательность событий:

  1. Form Loads
  2. ...
  3. Пользователь нажимает кнопку.
  4. TextChanged срабатывает, изменяя текст и привязывая событие.
  5. Пользователь нажимает кнопку.
  6. Сработало нажатие клавиши.

Что вы хотите сделать, так это связать событие с самого начала. Лучшее место - событие Form_Load .
Вы также можете использовать окно «Свойства» для привязки события во время разработки

7
ответ дан 9 December 2019 в 20:39
поделиться

Если бы вы не использовали магические числа, вы бы никогда не столкнулись с этой проблемой. Перепишите ваш if следующим образом:

if (!(c == '\b' || ('0' <= c && c <= '9') || ('A' <= c && c <= 'F') // et cetera
3
ответ дан 9 December 2019 в 20:39
поделиться

Используйте регулярное выражение:

using System.Text.RegularExpressions;

...

if (!(Regex.IsMatch(e.KeyChar.ToString(), "^[0-9a-fA-F]+$"))
     e.Handled = true;
2
ответ дан 9 December 2019 в 20:39
поделиться

Какой тип программы это веб-сайт ASP.NET или какой-то тип толстого клиента winforms / wpf? Причина, по которой я спрашиваю, заключается в том, что вы, возможно, тестируете устаревший код. В противном случае при изменении можно просто перевернуть логику проверки, чтобы она больше соответствовала тому, что вы хотите. Убедитесь, что введенный символ является одним элементом в разрешенном наборе. Ниже приведен рефакторинг.

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

В качестве альтернативного подхода, если вы просто хотите проверить все текстовое поле за один раз, а не после каждого нажатия клавиши, вы можете просто проанализировать значение, чтобы увидеть, является ли оно числом . Следующий фрагмент кода сгенерирует синтаксический анализ значения 11486525 из AF453d. Если число не является допустимым шестнадцатеричным значением, результат 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);
0
ответ дан 9 December 2019 в 20:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: