【问题标题】:NumericUpDown UpdateEditText causing problems when entering valuesNumericUpDown UpdateEditText 在输入值时导致问题
【发布时间】:2013-08-30 13:28:50
【问题描述】:

我创建了一个非常简单的 NumericUpDownPlus,它通过以下方式覆盖 UpdateEditText 方法:(根据这个 SO 问题: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 是新值的一部分,并立即恢复为旧值。

当然,我只对数字感兴趣,并不关心使用的是什么单位,这只是为了方便用户。我怎样才能让这个 NumericUpDown 合作?我想在控制获得焦点时清除该框,但我觉得这可能不是最好的解决方案。

【问题讨论】:

  • 您还必须重写 ParseEditText() 方法。在您完成诸如从字符串中剥离“px”之类的操作后分配 Value 属性。
  • 这很完美,我可以看到 ParseEditText 方法,但是当我尝试覆盖它时,它给了我There is no suitable method for override 并告诉我我正在向父类隐藏一个方法。跨度>
  • 哎呀,它是内部的。我讨厌 NUD :( 后备是覆盖 ValidateEditText()。解析它以分配 Value 并调用 UpdateEditText()。
  • 我相信在protected void ParseEditText 前面使用new 关键字将允许我“隐藏”基本方法,并提供我自己的实现。对吗?
  • 哈哈,太好了。感谢您的提示,我会按照您的方式试一试!

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


【解决方案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;
  }
}

【讨论】:

    【解决方案2】:
    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;
    }
    

    试试这个。

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-09-18
        • 1970-01-01
        • 2020-06-29
        • 2019-03-23
        • 1970-01-01
        相关资源
        最近更新 更多