C # шестнадцатеричная маска для ввода маскированного текста - PullRequest
6 голосов
/ 26 июля 2010

Я пытаюсь установить шестнадцатеричную маску для текстового поля.Так что можно вводить только действительные шестнадцатеричные числа.(И ',' и '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)

Ответы [ 7 ]

7 голосов
/ 26 июля 2010

Это:

c <= 0x66 && c >= 61 

Должно быть:

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

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

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

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

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

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

3 голосов
/ 26 июля 2010

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

if (!(c == '\b' || ('0' <= c && c <= '9') || ('A' <= c && c <= 'F') // et cetera
2 голосов
/ 26 июля 2010

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

using System.Text.RegularExpressions;

...

if (!(Regex.IsMatch(e.KeyChar.ToString(), "^[0-9a-fA-F]+$"))
     e.Handled = true;
0 голосов
/ 16 марта 2013

Основано на ответе Коби для 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");
                }
            }
        }
    }

Захватывает буквы, цифры и цифры клавиатуры.

0 голосов
/ 23 июня 2012
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;
}
0 голосов
/ 15 октября 2011

Зачем это усложнять?

    private void EnterKey(Object sender, System.Windows.Forms.KeyPressEventArgs e)
    {
        char c = e.KeyChar;
        e.Handled = !System.Uri.IsHexDigit(e.KeyChar) && c != 0x2C;
    }
0 голосов
/ 26 июля 2010

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

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

В качестве альтернативного подхода, если вы просто хотите проверить целое текстовое поле одновременно, а не после каждого нажатия клавиши, вы можете просто проанализировать значение, чтобы увидеть,это число.Следующий фрагмент кода сгенерирует синтаксический анализ значения 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);
...