2010-02-25 33 views
0

Winform控件的Text屬性總是字符串類型,所以如果我想暴露其他類型的自定義控件的屬性,我必須做如下轉換,如果我有幾十個屬性要公開,這對我來說會很痛苦。字符串<-> .NET中的int/float轉換痛苦winform

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

那麼,有沒有優雅的方式來做轉換?

回答

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); 
    } 
} 
1

您是否考慮過繼承TextBox控件,然後將其置於您的自定義控件上?您可以創建一個新的屬性來分析輸入字符串並返回一個整數。

0

不完全是這樣,但是通過使用類似的東西,您至少可以獲得一些安全性。 當人們嘗試並將文本放入長度字段時,這將爲您節省心疼!

​​
+0

謝謝,我省略了一些錯誤檢查代碼。 – Benny 2010-02-25 10:57:59

+0

David Mortons的建議可能是最好的,那麼編寫一個擴展TextBox的NumberBox類並寫一次轉換例程。 您可以創建一個SupportsFloat屬性並使用它來控制轉換例程,或者實際上只需編寫一個IntBox和FloatBox控件。 如果這是ASP.Net我建議使用控件擴展,不知道如果winforms有類似的想法? – 2010-02-25 11:03:00

相關問題