NumericUpDown UpdateEditText导致输入值时出现问题

本文关键字:问题 输入 UpdateEditText NumericUpDown | 更新日期: 2023-09-27 18:29:35

我创建了一个非常简单的NumericUpDownPlus,它以以下方式覆盖UpdateEditText方法:(根据这个SO问题:在NumericUpDown控件中,在数字后面有文本)

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

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

  1. 我选择了整个值,包括px,然后写入另一个值,即400,它就可以工作了,并重新追加px
  2. 我只选择数值,留下px,然后输入一个新值,但它认为px是新值的一部分,并立即恢复到旧值

当然,我只对数字感兴趣,不在乎使用什么单元,这只是为了方便用户。我怎样才能让这个NumericUpDown合作?我本来想在控制权集中的时候把盒子清空,但我觉得这可能不是最好的解决方案。

NumericUpDown UpdateEditText导致输入值时出现问题

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;
  }
}
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;
}

试试这个。

当我想添加货币格式时,我遇到了同样的问题,我通过重写文本属性:来解决这个问题

    [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;
    }