編寫與.net屬性視窗互動的RAD組件(六)

來源:互聯網
上載者:User
互動 又到周末了,有了那麼點屬於自己的時間,因此就把上次沒有發完的部分全部補上了,本文部分發到第五篇的時候,實際上已經發完了,現在要發的就是兌現我在自序中說過的話,將自己用TypeConverter實現的類型轉換器的源碼也一併發出來,在自序中沒有把原因說得很明白,如果你看了前面幾章又動手實驗過的話,就會知道這個原因,我照著文中所說的方法構造了自己的資料類型轉換器,IDE的屬性視窗的確也能正確展開並解析子屬性,但當我修改子屬性的時候,發現有兩個問題,一是子屬性無法修改(這個問題產生的具體原因我忘了),二是通過修改父屬性的字串會報個錯(好像是屬性類型不對的錯),於是我就只好自己動手從TypeConverter派生新的轉換器(原來的是從ExpandableObjectConverter),並且重載了多數方法(MSDN上有介紹),最關鍵的我覺得就是ConvertFrom方法的實現,構造好這個轉換器之後,屬性視窗就工作得很好,上面提到的兩個問題都沒有了,現在想來倒不是基類的選取的問題,主要還是要構造完全。

下面的代碼是我實現的關於PointF的類型轉換,如果是自訂類型,構造方式完全一樣,在重載時最關鍵的地方就是GetPropertys的實現,不能直接返回基類的方法,否則,子屬性的值是修改不了的,必須返回TypeDescriptor的GetPropertys,至於為什麼,請自行查閱MSDN上相關文章的介紹。

#region PointF的轉換類實現
/// <summary>
/// PointF的轉換類實現
/// </summary>
internal sealed class PointFConverter : TypeConverter
{

/// <summary>
/// 重載TypeConverter的CanConvertFrom方法
/// </summary>
/// <param name="context"></param>
/// <param name="sourceType"></param>
/// 要測試的目標類型
/// <returns></returns>
public override bool CanConvertFrom(ITypeDescriptorContext context,
Type sourceType)
{
if (sourceType == typeof(string)) //sourceType的類型是Type
{
return true;
}
return base.CanConvertFrom(context, sourceType);
}

/// <summary>
/// 重載TypeConverter的ConvertFrom方法
/// 定義從源類型到目標類型的轉換演算法
/// </summary>
/// <param name="context"></param>
/// <param name="culture"></param>
/// 本地化參數
/// <param name="value"></param>
/// 輸入字串
/// <returns></returns>
public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value)
{
if (value is string) //value是類型執行個體
{
string[] v = ((string)value).Split(new char[] {','});
return new PointF(float.Parse(v[0]), float.Parse(v[1]));
}
return base.ConvertFrom(context, culture, value);
}

/// <summary>
/// 重載TypeConverter的ConvertTo方法
/// 定義將自訂類型向目標類型轉換的演算法
/// </summary>
/// <param name="context"></param>
/// <param name="culture"></param>
/// <param name="value"></param>
/// <param name="destinationType"></param>
/// 目標類型
/// <returns></returns>
public override object ConvertTo(ITypeDescriptorContext context,CultureInfo culture, object value, Type destinationType)
{
if (destinationType == typeof(string)) //destinationType的類型是Type
{
return ((PointF)value).X + "," + ((PointF)value).Y;
}
return base.ConvertTo(context, culture, value, destinationType);
}

/// <summary>
/// 開啟Expandable
/// 不調用基類虛函數
/// </summary>
/// <param name="context"></param>
/// <returns></returns>
public override bool GetPropertiesSupported(ITypeDescriptorContext context)
{
return true;
}

/// <summary>
/// 取得子屬性列表
/// 返回使用TypeDescriptor對象獲得合適的類型解析
/// 不能調用基類虛函數
/// </summary>
/// <param name="context"></param>
/// <param name="value"></param>
/// <param name="attributes"></param>
/// <returns></returns>
public override PropertyDescriptorCollection GetProperties(ITypeDescriptorContext context, object value, Attribute[] attributes)
{
return TypeDescriptor.GetProperties (value, attributes);
}

}
#endregion PointF的轉換類實現


-----------------------------------------------------------------------------------------------

這篇文章中對於如何屬性預設值的描述不怎麼詳細,可以參看我自己寫的《定義組件屬性的預設值》

http://blog.csdn.net/zoulng/archive/2005/03/23/328342.aspx

<<<<<<<<<<<<完>>>>>>>>>>>>>>>



相關文章

E-Commerce Solutions

Leverage the same tools powering the Alibaba Ecosystem

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。