Ищете простой элемент управления числовым редактированием на C #

StackOverflow https://stackoverflow.com/questions/76963

  •  09-06-2019
  •  | 
  •  

Вопрос

Я программист 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).

Это приведет к получению его с обычным текстовым полем, если вы хотите, в противном случае приведенная выше рекомендация хороша.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top