创建十六进制NumericUpDown控件

本文关键字:控件 NumericUpDown 十六进制 创建 | 更新日期: 2023-09-27 17:51:00

我创建了一个十六进制NumericUpDown控件,通过子类化基本的NumericUpDown并添加以下方法:

protected override void UpdateEditText()
{
  this.Text = "0x" + ((int) Value).ToString("X2");
}

这工作得很好。控件现在以以下格式显示值:

0 x3f

这正是我想要的

但是有一件事困扰着我:每次赋值Text-属性时,一个系统。抛出FormatException。这似乎不影响控件的功能,但我仍然认为它很丑。

这是callstack的顶部:

HexNumericUpDown.UpdateEditText()第31行c#System.Windows.Forms.dll ! System.Windows.Forms.NumericUpDown.ValidateEditText()未知System.Windows.Forms.dll ! System.Windows.Forms.UpDownBase.Text。set(string value) Unknown

我可以忽略这个异常吗?还是有一个干净的方法来摆脱它?

创建十六进制NumericUpDown控件

您需要重写ValidateEditText()方法,以便您可以正确地处理(可选的)"0 x"前缀。并覆盖UpdateEditText()前缀"0x"。向项目添加一个新类,并粘贴如下所示的代码。编译。将新控件从工具箱顶部拖放到窗体上:

using System;
using System.Windows.Forms;
class HexUpDown : NumericUpDown {
    public HexUpDown() {
        this.Hexadecimal = true;
    }
    protected override void ValidateEditText() {
        try {
            var txt = this.Text;
            if (!string.IsNullOrEmpty(txt)) {
                if (txt.StartsWith("0x")) txt = txt.Substring(2);
                var value = Convert.ToDecimal(Convert.ToInt32(txt, 16));
                value = Math.Max(value, this.Minimum);
                value = Math.Min(value, this.Maximum);
                this.Value = value;
            }
        }
        catch { }
        base.UserEdit = false;
        UpdateEditText();
    }
    protected override void UpdateEditText() {
        int value = Convert.ToInt32(this.Value);
        this.Text = "0x" + value.ToString("X4");
    }
}

现在,奇特的try/catch-em-all直接来自。net版本。我保留它是为了使控件的行为保持一致。按你想要的方式调整ToString()参数

我猜你还需要重写ParseEditText ValidateEditText方法,接受十六进制值并将value属性设置为正确的int值。

类型转换和ConvertTo:

(int)obj -这是obj到int类型的显式强制转换,你告诉编译器obj是int类型。如果obj不是int类型,就会得到强制转换异常。但它并不是真正意义上的 int。X2格式需要实整型。

Convert.ToInt32(obj) -这是对Convert类的显式调用,以返回obj的int表示

因为你需要使用Convert.ToInt32(Value)

但是MSDN中显示:

这个API (numericUpDown.Text)支持。net框架基础结构,不打算直接从您的代码中使用。

2)文本对NumericUpDown的外观没有影响控制;因此,它是隐藏在设计师和从智能感知。