自訂群組件之屬性(Property)的性質(Attribute)介紹(三)

來源:互聯網
上載者:User
2、展開的形式

展開的形式多用於一個屬性為我們自訂類的類型,比如我們定義了一個類,該類中的一個屬性是另一個我們定義的類。在這種情況下屬性瀏覽器預設是沒有辦法來進行類型轉換的,所以顯示為不可編輯的內容。如果我們要以展開的形式編輯這個屬性就需要我們向上面一樣來重寫屬性轉換器。

我們首先定義一個自己的類來作為以後的屬性類型。具體代碼如下:

public class ExpandProperty

{

private int _intList=0;

public int IntList

{

get { return this._intList;}

set { this._intList=value; }

}



private string _strList="Null";

public string StrList

{

get { return this._strList;}

set { this._strList= value;}

}

}

然後我們在自己的另一個類中聲明一個這個類型的屬性,在這裡如果我們不加任何的性質限制,屬性瀏覽器是不能轉換改屬性的。具體實現該屬性的代碼如下:

private ExpandProperty _dropList;



[CategoryAttribute("自訂的複雜類型設定(包括自訂類型轉換器)"),

TypeConverterAttribute(typeof(PropertyGridApp.ExpandConverter)),

ReadOnlyAttribute(false)]

public ExpandProperty DropList

{

get { return this._dropList;}

set { this._dropList= value;}

}

為了讓屬性瀏覽器能夠編輯該屬性,也就是說能夠把該屬性轉換成字串,而且能夠從字串轉換成該類的一個執行個體需要我們寫如下的代碼:

/// <summary>

/// 可以展開的類型轉換器

/// ExpandProperty

/// </summary>

public class ExpandConverter:System.ComponentModel.ExpandableObjectConverter

{

public ExpandConverter()

{

}



/// <summary>

/// 覆蓋此方法已確定屬性是否可以轉換

/// </summary>

public override bool CanConvertTo(System.ComponentModel.ITypeDescriptorContext context, System.Type destinationType)

{

if (destinationType==typeof(PropertyGridApp.ExpandProperty))

return true;



return base.CanConvertTo(context,destinationType);

}



/// <summary>

/// 覆蓋此方法並確保destinationType參數是一個String,然後格式化所顯示的內容

/// </summary>

public override object ConvertTo(System.ComponentModel.ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value, System.Type destinationType)

{

if (destinationType == typeof (System.String) && value is PropertyGridApp.ExpandProperty)

{

PropertyGridApp.ExpandProperty source=(PropertyGridApp.ExpandProperty)value;

return source.IntList+","+source.StrList;

}



return base.ConvertTo(context,culture,value,destinationType);



}



/// <summary>

/// 覆蓋此方法已確定輸入的字串是可以被轉化

/// </summary>

public override bool CanConvertFrom(System.ComponentModel.ITypeDescriptorContext context, System.Type sourceType)

{

if (sourceType==typeof(string))

return true;

return base.CanConvertFrom(context,sourceType);



}



/// <summary>

/// 覆蓋此方法根據 ConvertTo() 方法的轉換格式來把所輸入的字串轉換成類,並返回該類

/// </summary>

public override object ConvertFrom(System.ComponentModel.ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value)

{

if (value is string)

{

string s=(string)value;

int comma=s.IndexOf(",");

if (comma!=-1)

{

try

{

string intList=s.Substring(0,comma);

string strList=s.Substring(comma+1,s.Length-comma-1);

PropertyGridApp.ExpandProperty Ep=new ExpandProperty();

Ep.IntList=int.Parse(intList);

Ep.StrList=strList;

return Ep;

}

catch

{

return base.ConvertFrom(context,culture,value);

}

}

}



return base.ConvertFrom(context,culture,value);

}

}

編譯之後的畫面如下:



相關文章

E-Commerce Solutions

Leverage the same tools powering the Alibaba Ecosystem

Learn more >

11.11 Big Sale for Cloud

Get Unbeatable Offers with up to 90% Off,Oct.24-Nov.13 (UTC+8)

Get It Now >

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 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。