国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > .NET > 正文

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

2024-07-10 13:03:51
字體:
來源:轉載
供稿:網友
又到周末了,有了那么點屬于自己的時間,因此就把上次沒有發完的部分全部補上了,正文部分發到第五篇的時候,實際上已經發完了,現在要發的就是兌現我在自序中說過的話,將自己用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

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



發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 金乡县| 怀集县| 谷城县| 大城县| 兴宁市| 南陵县| 辽阳县| 昌黎县| 安国市| 宣恩县| 武平县| 威信县| 长岭县| 鄂伦春自治旗| 芒康县| 都安| 日喀则市| 虎林市| 枝江市| 洛隆县| 永城市| 祁门县| 静安区| 姚安县| 彩票| 名山县| 图木舒克市| 新兴县| 邵武市| 临潭县| 泾川县| 克什克腾旗| 韩城市| 安西县| 海口市| 沙坪坝区| 赤水市| 江陵县| 西安市| 芮城县| 石家庄市|