2

我创建了一个非常简单的 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 合作?我想在控制获得焦点时清除框,但我觉得这可能不是最好的解决方案。

4

3 回答 3

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;
  }
}
于 2013-08-30T14:09:14.450 回答
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;
    }
于 2014-11-12T15:05:47.590 回答
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;
}

试试这个。

于 2013-08-30T14:06:10.890 回答