C#實(shí)現(xiàn)ProperTyGrid自定義屬性的方法
本文實(shí)例講解了C#實(shí)現(xiàn)ProperTyGrid自定義屬性的方法,分享給大家供大家參考。具體方法如下:
一般來(lái)說(shuō),C#如果要實(shí)現(xiàn)自定義屬性必須要需要實(shí)現(xiàn)接口ICustomTypeDescriptor,具體實(shí)現(xiàn)方法如下:
// 摘要: // 提供為對(duì)象提供動(dòng)態(tài)自定義類型信息的接口。 public interface ICustomTypeDescriptor
示例如下:
/// <summary>
/// 自定義屬性對(duì)象
/// </summary>
public class MyAttr
{
private string name = string.Empty;
public string Name
{
get { return name; }
set { name = value; }
}
private object value = null;
public object Value
{
get { return this.value; }
set { this.value = value; }
}
private string description = string.Empty;
public string Description
{
get { return description; }
set { description = value; }
}
public override string ToString()
{
return string.Format("Name:{0},Value:{1}",name.ToString(),value.ToString());
}
}
/// <summary>
/// 自定義性質(zhì)描述類
/// </summary>
public class MyPropertyDescription : PropertyDescriptor
{
private MyAttr myattr = null;
public MyPropertyDescription(MyAttr myattr, Attribute[] attrs): base(myattr.Name, attrs)
{
this.myattr = myattr;
}
public override bool CanResetValue(object component)
{
return false;
}
public override Type ComponentType
{
get
{
return this.GetType();
}
}
public override object GetValue(object component)
{
return myattr.Value;
}
public override bool IsReadOnly
{
get
{
return false;
}
}
public override Type PropertyType
{
get
{
return myattr.Value.GetType();
}
}
public override void ResetValue(object component)
{
//不重置,無(wú)動(dòng)作
}
public override void SetValue(object component, object value)
{
myattr.Value = value;
}
/// <summary>
/// 是否應(yīng)該持久化保存
/// </summary>
/// <param name="component"></param>
/// <returns></returns>
public override bool ShouldSerializeValue(object component)
{
return false;
}
/// <summary>
/// 屬性說(shuō)明
/// </summary>
public override string Description
{
get
{
return myattr.Description;
}
}
}
/// <summary>
/// 實(shí)現(xiàn)自定義的特殊屬性對(duì)象必須繼承ICustomTypeDescriptor,并實(shí)現(xiàn)Dictionary
/// </summary>
public class MyAttrCollection : Dictionary<String, MyAttr>, ICustomTypeDescriptor
{
/// <summary>
/// 重寫Add方法
/// </summary>
/// <param name="attr"></param>
public void Add(MyAttr attr)
{
if (!this.ContainsKey(attr.Name))
{
base.Add(attr.Name, attr);
}
}
public AttributeCollection GetAttributes()
{
return TypeDescriptor.GetAttributes(this, true);
}
public string GetClassName()
{
return TypeDescriptor.GetClassName(this,true);
}
public string GetComponentName()
{
return TypeDescriptor.GetClassName(this, true);
}
public TypeConverter GetConverter()
{
return TypeDescriptor.GetConverter(this, true);
}
public EventDescriptor GetDefaultEvent()
{
return TypeDescriptor.GetDefaultEvent(this, true);
}
public PropertyDescriptor GetDefaultProperty()
{
return TypeDescriptor.GetDefaultProperty(this, true);
}
public object GetEditor(Type editorBaseType)
{
return TypeDescriptor.GetEditor(this, editorBaseType, true);
}
public EventDescriptorCollection GetEvents(Attribute[] attributes)
{
return TypeDescriptor.GetEvents(this, attributes, true);
}
public EventDescriptorCollection GetEvents()
{
return TypeDescriptor.GetEvents(this, true);
}
public PropertyDescriptorCollection GetProperties(Attribute[] attributes)
{
int count=this.Values.Count;
PropertyDescriptor[] pds=new PropertyDescriptor[count];
int index = 0;
foreach (MyAttr item in this.Values)
{
pds[index] = new MyPropertyDescription(item,attributes);
index++;
}
return new PropertyDescriptorCollection(pds);
}
public PropertyDescriptorCollection GetProperties()
{
return TypeDescriptor.GetProperties(this,true);
}
public object GetPropertyOwner(PropertyDescriptor pd)
{
return this;
}
}
前臺(tái)調(diào)用如下圖所示:

private void btnAddProperType_Click(object sender, EventArgs e)
{
MyAttr attr = new MyAttr();
attr.Name = txtName.Text.Trim();
attr.Value = txtValue.Text.Trim();
attr.Description = txtDescription.Text.Trim();
mac.Add(attr);
MyGrid.Refresh();
}
private void button1_Click(object sender, EventArgs e)
{
AddAttrColor();
AddAttrImage();
AddAttrEmun();
MyGrid.Refresh();
}
private void AddAttrEmun()
{
MyAttr attr = new MyAttr();
attr.Name = "Dock";
attr.Value = DockStyle.Fill;
attr.Description = "枚舉";
mac.Add(attr);
}
private void AddAttrImage()
{
MyAttr attr = new MyAttr();
attr.Name = "Image";
attr.Value = new Bitmap(400,300);
attr.Description = "圖片";
mac.Add(attr);
}
private void AddAttrColor()
{
MyAttr attr = new MyAttr();
attr.Name = "Color";
attr.Value = Color.Red;
attr.Description = "顏色";
mac.Add(attr);
}
運(yùn)行效果如下圖所示:

希望本文所述對(duì)大家的C#程序設(shè)計(jì)有所幫助
相關(guān)文章
基于C# 寫一個(gè) Redis 數(shù)據(jù)同步小工具
Redis支持主從同步。數(shù)據(jù)可以從主服務(wù)器向任意數(shù)量的從服務(wù)器上同步,從服務(wù)器可以是關(guān)聯(lián)其他從服務(wù)器的主服務(wù)器。這篇文章主要介紹了用 C# 寫一個(gè) Redis 數(shù)據(jù)同步小工具,需要的朋友可以參考下2020-02-02
unity實(shí)現(xiàn)鼠標(biāo)經(jīng)過(guò)時(shí)ui及物體的變色操作
這篇文章主要介紹了unity實(shí)現(xiàn)鼠標(biāo)經(jīng)過(guò)時(shí)ui及物體的變色操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-04-04
c# OpenCvSharp實(shí)現(xiàn)常見檢測(cè)(斑點(diǎn)檢測(cè),輪廓檢測(cè),邊緣檢測(cè))
這篇文章主要為大家詳細(xì)介紹了c#如何使用OpenCvSharp實(shí)現(xiàn)常見檢測(cè)(斑點(diǎn)檢測(cè),輪廓檢測(cè),邊緣檢測(cè)),文中的示例代碼講解詳細(xì),需要的小伙伴可以參考下2023-12-12
C#自定義DataGridViewColumn顯示TreeView
我們可以自定義DataGridView的DataGridViewColumn來(lái)實(shí)現(xiàn)自定義的列,下面介紹一下如何通過(guò)擴(kuò)展DataGridViewColumn來(lái)實(shí)現(xiàn)一個(gè)TreeViewColumn2015-12-12
C# MVC模式中應(yīng)該怎樣區(qū)分應(yīng)用程序邏輯(Controller層)和業(yè)務(wù)邏輯(Model層)?
這篇文章主要介紹了C# MVC模式中應(yīng)該怎樣區(qū)分應(yīng)用程序邏輯(Controller層)和業(yè)務(wù)邏輯(Model層)?,這也小編做.NET項(xiàng)目時(shí)經(jīng)常思考和讓人混亂的一個(gè)問(wèn)題,這篇文章寫的挺好,一下清晰了許多,需要的朋友可以參考下2015-06-06
Unity實(shí)現(xiàn)簡(jiǎn)單手勢(shì)識(shí)別
這篇文章主要為大家詳細(xì)介紹了Unity實(shí)現(xiàn)簡(jiǎn)單手勢(shì)識(shí)別,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-07-07
C#實(shí)現(xiàn)目錄跳轉(zhuǎn)(TreeView和SplitContainer)的示例代碼
本文主要介紹了C#實(shí)現(xiàn)目錄跳轉(zhuǎn)(TreeView和SplitContainer)的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-07-07

