字符串< - > .net winform中的int / float转换痛苦

时间:2010-02-25 10:51:54

标签: c# winforms type-conversion

winform上的控件的Text属性总是字符串类型,所以如果我想要为自定义控件公开其他类型的属性,我必须进行如下转换,如果我有几十个要暴露的属性,它将是这样的对我来说很痛苦。

  public int ImageGroupLength
    {
        get
        {
            return int.Parse(this.imageGroupLength.Text);
        }
        set
        {
            this.imageGroupLength.Text = value.ToString();
        }
    }

那么,有没有优雅的方式进行转换?

3 个答案:

答案 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
  {
    ...
  }
}