當前位置:開發者網絡 >> 技術教程 >> .NET教程 >> 組件控件開發 >> 內容
精彩推薦
分類最新教程
分類熱點教程
    
編寫與.net屬性窗口交互的RAD組件(六)
作者:未知
日期:2005-03-28
人氣:
投稿:snow(轉貼)
來源:未知
字體:
收藏:加入瀏覽器收藏
以下正文:
又到週末了,有了那麼點屬於自己的時間,因此就把上次沒有發完的部分全部補上了,正文部分發到第五篇的時候,實際上已經發完了,現在要發的就是兌現我在自序中說過的話,將自己用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

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

相關文章: