NumericUpDown UpdateEditText在输入值时导致问题

时间:2013-08-30 13:28:50

标签: c# .net winforms user-controls numericupdown

我创建了一个非常简单的NumericUpDownPlus,它以下列方式覆盖了UpdateEditText方法:(根据这个问题:Having text inside NumericUpDown control, after the number

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

但是,这会在手动编辑控件时出现问题。在这种情况下,我将“px”作为我的单位,并且可能出现以下情况:

  1. 我选择整个值,包括px并写入另一个值,即400,它可以工作,然后重新附加px。
  2. 我只选择数字值,留下px,然后输入一个新值,但是它认为px是新值的一部分,并立即恢复为旧值。
  3. 当然,我只对数字感兴趣,并不关心使用什么单位,这只是为用户带来便利。如何让这个NumericUpDown合作?当控件获得焦点时,我只想清除盒子,但我觉得这可能不是最好的解决方案。

3 个答案:

答案 0 :(得分: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;
  }
}

答案 1 :(得分: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;
}

试试这个。

答案 2 :(得分: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;
    }