winform上的控件的Text属性总是字符串类型,所以如果我想要为自定义控件公开其他类型的属性,我必须进行如下转换,如果我有几十个要暴露的属性,它将是这样的对我来说很痛苦。
public int ImageGroupLength
{
get
{
return int.Parse(this.imageGroupLength.Text);
}
set
{
this.imageGroupLength.Text = value.ToString();
}
}
那么,有没有优雅的方式进行转换?
答案 0 :(得分:1)
您是否考虑过对TextBox控件进行子类化,而只是将其放在自定义控件上?您可以创建一个新属性来解析输入字符串并返回一个整数。
答案 1 :(得分:1)
创建自己的控件是这里的方法。在项目中添加一个新类并粘贴下面显示的代码。编译。新控件显示在工具箱的顶部。您需要实现BadValue事件以警告用户输入的文本不合适。当Value属性发生变化时,ValueChanged可用于获取事件。
using System;
using System.Windows.Forms;
class ValueBox : TextBox {
public event EventHandler BadValue;
public event EventHandler ValueChanged;
private int mValue;
public int Value {
get { return mValue; }
set {
if (value != mValue) {
mValue = value;
OnValueChanged(EventArgs.Empty);
base.Text = mValue.ToString();
}
}
}
protected void OnValueChanged(EventArgs e) {
EventHandler handler = ValueChanged;
if (handler != null) handler(this, e);
}
protected void OnBadValue(EventArgs e) {
EventHandler handler = BadValue;
if (handler != null) handler(this, e);
}
protected override void OnHandleCreated(EventArgs e) {
base.OnHandleCreated(e);
base.Text = mValue.ToString();
}
protected override void OnValidating(System.ComponentModel.CancelEventArgs e) {
int value;
if (!int.TryParse(base.Text, out value)) {
SelectionStart = 0;
SelectionLength = base.Text.Length;
e.Cancel = true;
OnBadValue(EventArgs.Empty);
}
else base.OnValidating(e);
}
}
答案 2 :(得分:0)
不完全是,但你可以通过使用这样的东西至少获得一些安全性。 当人们尝试将文本放入长度字段时,这将为您节省心痛!
public int ImageGroupLength
{
get
{
int ret;
int.TryParse(this.imageGroupLength.Text, out ret);
return ret; //Ret will be 0 if tryparse fails
}
set
{
...
}
}