2013-08-30 4 views
2

я создал очень простой NumericUpDownPlus, который переопределяет метод UpdateEditText следующим образом: (В соответствии с этим СЦ вопрос: Having text inside NumericUpDown control, after the number)NumericUpDown UpdateEditText вызывает проблемы при вводе значений

protected override void UpdateEditText() 
{ 
    if (string.IsNullOrWhiteSpace(Units)) 
    { 
     base.UpdateEditText(); 
    } 
    else 
    { 
     this.Text = this.Value + " " + Units; 
    } 
} 

Однако, это вызывает у меня проблемы при редактировании элемента управления вручную. В этом случае, я добавление «точек», как мои единицы, и могут возникнуть следующие ситуации:

  1. Я выбираю все значения, в том числе точек и писать в другой, то есть 400, и она работает, и повторно -прибывает px.
  2. Я выбираю только числовое значение, оставляя px и вводя новое значение, однако он считает, что px является частью нового значения и сразу же возвращается к старому значению.

Конечно, меня интересует только номер, и мне все равно, какое устройство используется, это просто удобство для пользователя. Как я могу заставить этот NumericUpDown сотрудничать? Я думал о том, чтобы просто очистить ящик, когда управление получает фокус, но я чувствую, что это может быть не лучшим решением.

+2

Вы также должны переопределить метод ParseEditText(). Назначьте свойство Value после того, как вы сделали что-то вроде полосы из «px» из строки. –

+0

Это прекрасно, и я могу увидеть метод ParseEditText, но когда я пытаюсь переопределить его, он дает мне «Нет подходящего метода для переопределения», а также говорит мне, что я скрываю метод из родительского класса. –

+1

О, стреляйте, это внутреннее. Я ненавижу NUD :(Fallback должен переопределить ValidateEditText(). Разберите его, чтобы назначить значение и вызвать UpdateEditText(). –

ответ

0
protected override void UpdateEditText() 
{ 
      base.ParseEditText(); 
      if (!string.IsNullOrEmpty(this.Text)) 
      { 
       decimal value; 
       decimal.TryParse(this.Text.Replace(Units,"").Trim(),out value); 
       this.Value = value; 
      } 
      this.Text = this.Value + " " + Units; 
} 

Попробуйте это.

1
protected override void UpdateEditText() { 
    if (string.IsNullOrWhiteSpace(Units)) { 
    base.UpdateEditText(); 
    } else { 
    try { 
     Value = decimal.Parse(Text.Replace(Units, "").Trim()); 
    } catch { 
     base.UpdateEditText(); 
    } 
    this.Text = this.Value + " " + Units; 
    } 
} 
0

У меня такая же проблема, когда я хочу добавить формат валюты, я решить эту проблему путем переопределения текста собственности:

[Bindable(false)] 
    [Browsable(false)] 
    [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] 
    [EditorBrowsable(EditorBrowsableState.Never)] 
    public override string Text 
    { 
     get 
     { 
      string formattedValue = ParseEditText(base.Text); 
      return formattedValue; 
     } 
     set 
     { 

      base.Text = value; 
     } 
    } 


    protected override void UpdateEditText() 
    { 
     string formatSpecifier = "N"; 

     switch (DisplayFormatSpecifier) 
     { 
      case DisplayFormatSpecifier.Euro: 
       formatSpecifier = "C"; 
       break; 
      case DisplayFormatSpecifier.Percent: 
       formatSpecifier = "P"; 
       break; 
      case DisplayFormatSpecifier.Number: 
       formatSpecifier = "N"; 
       break; 
      default: 
       formatSpecifier = "N"; 
       break; 
     } 
     formatSpecifier += DecimalPlaces.ToString(); 
     this.Text = this.Value.ToString(formatSpecifier.ToString(), formatProvider); 
    } 

    /// <summary> 
    /// Remove the last character if is not a digit 
    /// </summary> 
    private string ParseEditText(string text) 
    { 
     string textReplace = text; 
     if (!string.IsNullOrWhiteSpace(text)) 
     { 
      char c = text[text.Length - 1]; 
      if (!char.IsDigit(c)) 
      { 
       textReplace = textReplace.Replace(c.ToString(), string.Empty); 
      } 
     } 
     return textReplace; 
    } 
Смежные вопросы