我创建了一个非常简单的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”作为我的单位,并且可能出现以下情况:
当然,我只对数字感兴趣,并不关心使用什么单位,这只是为用户带来便利。如何让这个NumericUpDown合作?当控件获得焦点时,我只想清除盒子,但我觉得这可能不是最好的解决方案。
答案 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;
}