Я пытаюсь установить шестнадцатеричную маску для текстового поля. Так, чтобы только допустимые шестнадцатеричные номера могли быть введены. (И'', и 'ВХОДЯТ'),
Это почти работает. До сих пор это только позволит строчные буквы от 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)
Это:
c <= 0x66 && c >= 61
Должно быть:
c <= 0x66 && c >= 0x61 //hex literal
Обратите внимание, что вы тратите драгоценное время, просматривая шестнадцатеричные коды, вы можете легко сравнивать символы:
if ((c >= 'a') && (c <= 'f'))
Что касается первого символа: вы не должны связывать Нажатие клавиши
в событии TextChanged
- уже слишком поздно! Вот последовательность событий:
Что вы хотите сделать, так это связать событие с самого начала. Лучшее место - событие 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 && 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);