Ищете простой элемент управления числовым редактированием на C #
Вопрос
Я программист MFC, новичок в C #, и я ищу простой элемент управления, который позволит вводить числа и проверять диапазон.
Решение
Посмотрите на элемент управления "NumericUpDown".У него есть проверка диапазона, входные данные всегда будут числовыми, и у него есть эти изящные кнопки увеличения / уменьшения.
Другие советы
Мне пришлось реализовать элемент управления, который принимал только числа, целые или вещественные числа.Я создаю элемент управления как специализацию (читать:производный от) элемент управления текстовым полем и использование элемента управления вводом и обычного выражения для проверки.Добавить проверку диапазона ужасно просто.
Это код для создания регулярного выражения._numericSeparation - это строка с символами, принимаемыми в качестве десятичных значений через запятую (например, a '.' или a ',':$10.50 10,50€
private string ComputeRegexPattern()
{
StringBuilder builder = new StringBuilder();
if (this._forcePositives)
{
builder.Append("([+]|[-])?");
}
builder.Append(@"[\d]*((");
if (!this._useIntegers)
{
for (int i = 0; i < this._numericSeparator.Length; i++)
{
builder.Append("[").Append(this._numericSeparator[i]).Append("]");
if ((this._numericSeparator.Length > 0) && (i != (this._numericSeparator.Length - 1)))
{
builder.Append("|");
}
}
}
builder.Append(@")[\d]*)?");
return builder.ToString();
}
Регулярное выражение соответствует любому числу (т. е.любая строка с числовыми символами) только с одним символом в качестве числового разделения и необязательным символом "+" или "-" в начале строки.Как только вы создаете регулярное выражение (при создании экземпляра элемента управления), вы проверяете, является ли значение правильным, переопределяя метод OnValidating.CheckValidNumber() просто применяет регулярное выражение к введенному тексту.Если совпадение регулярных выражений завершается неудачей, активируется поставщик ошибок с указанной ошибкой (задается с помощью общедоступного свойства ValidationError) и вызывает событие ValidationError.Здесь вы могли бы выполнить проверку, чтобы узнать, находится ли номер в требуемом диапазоне.
private bool CheckValidNumber()
{
if (Regex.Match(this.Text, this.RegexPattern).Value != this.Text)
{
this._errorProvider.SetError(this, this.ValidationError);
return false;
}
this._errorProvider.Clear();
return true;
}
protected override void OnValidating(CancelEventArgs e)
{
bool flag = this.CheckValidNumber();
if (!flag)
{
e.Cancel = true;
this.Text = "0";
}
base.OnValidating(e);
if (!flag)
{
this.ValidationFail(this, EventArgs.Empty);
}
}
Как я уже сказал, я также запрещаю пользователю вводить данные в текстовое поле, отличные от числовых символов, переопределяющих метод OnKeyPress:
protected override void OnKeyPress(KeyPressEventArgs e)
{
if ((!char.IsDigit(e.KeyChar) && !char.IsControl(e.KeyChar)) && (!this._numberSymbols.Contains(e.KeyChar.ToString()) && !this._numericSeparator.Contains(e.KeyChar.ToString())))
{
e.Handled = true;
}
if (this._numberSymbols.Contains(e.KeyChar.ToString()) && !this._forcePositives)
{
e.Handled = true;
}
if (this._numericSeparator.Contains(e.KeyChar.ToString()) && this._useIntegers)
{
e.Handled = true;
}
base.OnKeyPress(e);
}
Элегантный штрих:Я проверяю, действителен ли номер каждый раз, когда пользователь отпускает ключ, чтобы пользователь мог получать обратную связь по мере ввода.(Но помните, что вы должны быть осторожны с событием ValidationFail ;))
protected override void OnKeyUp(KeyEventArgs e)
{
this.CheckValidNumber();
base.OnKeyUp(e);
}
Вы можете использовать обычное текстовое поле и элемент управления Validator для управления вводом.
Попробуйте использовать элемент управления поставщика ошибок для проверки текстового поля.Вы можете использовать int .TryParse() или double .TryParse(), чтобы проверить, является ли оно числовым, а затем подтвердить диапазон.
Вы можете использовать комбинацию RequiredFieldValidator и CompareValidator (установите значение DataTypeCheck для оператора и введите значение Integer).
Это приведет к получению его с обычным текстовым полем, если вы хотите, в противном случае приведенная выше рекомендация хороша.