创建一个十六进制的数字增减控件

8
我通过子类化基本的 NumericUpDown 并添加了以下方法,创建了一个十六进制的 NumericUpDown 控件:
protected override void UpdateEditText()
{
  this.Text = "0x" + ((int) Value).ToString("X2");
}

这个做得相当不错。控件现在以以下格式显示值:

0x3F

这正是我想要的。

但有一件事情让我困扰:每次赋值Text属性时,都会抛出一个System.FormatException。这似乎并不影响控件的功能,但我觉得这很丑陋。

以下是调用栈的顶部内容:

MyAssembly.dll!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) 未知

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


你可能在TextChanged事件上运行了一些尝试将字符串转换回整数的代码吗? - Jens
每次分配Text属性时,都会抛出System.FormatException异常,但在哪里?请发布堆栈跟踪。 - Sriram Sakthivel
完成了。我已经添加了堆栈跟踪。 - Boris
文本无效。您应该重写ValidateEditText并允许十六进制字符串。 - Panagiotis Kanavos
3个回答

7

您需要重写ValidateEditText()方法以便正确处理(可选的)"0x"前缀。并且重写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()参数。


0

转换和强制类型转换有所不同:

(int)obj - 这是将 obj 强制转换为 int 类型。您告诉编译器 obj 是一个整数。如果 obj 不是整数类型,则会出现类型转换异常。但它并不真的是一个整数,X2 格式需要真正的整数。

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

因此,您需要使用 Convert.ToInt32(Value)

但是在 MSDN 中说:

1)此 API(numericUpDown.Text)支持 .NET Framework 基础结构,并不打算直接从您的代码中使用。

2)Text 对 NumericUpDown 控件的外观没有影响;因此,在设计器中和 IntelliSense 中隐藏它。


那并没有解决问题。异常发生在将值分配给Text属性时。int强制转换不会引起异常。 - Boris
this.Text,"this" 是什么? - israel altar
这是一个数字增减控件。 - Boris
我编辑了答案,因为它对于评论来说有点长。 - israel altar

0

ParseEditText不是虚函数,但ValidateEditText是。 - Panagiotis Kanavos

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接