创建十六进制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
我可以忽略这个异常吗?还是有一个干净的方法来摆脱它?
您需要重写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的外观没有影响控制;因此,它是隐藏在设计师和从智能感知。