C#實現(xiàn)ProperTyGrid自定義屬性的方法
本文實例講解了C#實現(xiàn)ProperTyGrid自定義屬性的方法,分享給大家供大家參考。具體方法如下:
一般來說,C#如果要實現(xiàn)自定義屬性必須要需要實現(xiàn)接口ICustomTypeDescriptor,具體實現(xiàn)方法如下:
// 摘要: // 提供為對象提供動態(tài)自定義類型信息的接口。 public interface ICustomTypeDescriptor
示例如下:
/// <summary> /// 自定義屬性對象 /// </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) { //不重置,無動作 } public override void SetValue(object component, object value) { myattr.Value = value; } /// <summary> /// 是否應該持久化保存 /// </summary> /// <param name="component"></param> /// <returns></returns> public override bool ShouldSerializeValue(object component) { return false; } /// <summary> /// 屬性說明 /// </summary> public override string Description { get { return myattr.Description; } } } /// <summary> /// 實現(xiàn)自定義的特殊屬性對象必須繼承ICustomTypeDescriptor,并實現(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; } }
前臺調(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); }
運行效果如下圖所示:
希望本文所述對大家的C#程序設計有所幫助
相關文章
基于C# 寫一個 Redis 數(shù)據(jù)同步小工具
Redis支持主從同步。數(shù)據(jù)可以從主服務器向任意數(shù)量的從服務器上同步,從服務器可以是關聯(lián)其他從服務器的主服務器。這篇文章主要介紹了用 C# 寫一個 Redis 數(shù)據(jù)同步小工具,需要的朋友可以參考下2020-02-02unity實現(xiàn)鼠標經(jīng)過時ui及物體的變色操作
這篇文章主要介紹了unity實現(xiàn)鼠標經(jīng)過時ui及物體的變色操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-04-04c# OpenCvSharp實現(xiàn)常見檢測(斑點檢測,輪廓檢測,邊緣檢測)
這篇文章主要為大家詳細介紹了c#如何使用OpenCvSharp實現(xiàn)常見檢測(斑點檢測,輪廓檢測,邊緣檢測),文中的示例代碼講解詳細,需要的小伙伴可以參考下2023-12-12C#自定義DataGridViewColumn顯示TreeView
我們可以自定義DataGridView的DataGridViewColumn來實現(xiàn)自定義的列,下面介紹一下如何通過擴展DataGridViewColumn來實現(xiàn)一個TreeViewColumn2015-12-12C# MVC模式中應該怎樣區(qū)分應用程序邏輯(Controller層)和業(yè)務邏輯(Model層)?
這篇文章主要介紹了C# MVC模式中應該怎樣區(qū)分應用程序邏輯(Controller層)和業(yè)務邏輯(Model層)?,這也小編做.NET項目時經(jīng)常思考和讓人混亂的一個問題,這篇文章寫的挺好,一下清晰了許多,需要的朋友可以參考下2015-06-06C#實現(xiàn)目錄跳轉(TreeView和SplitContainer)的示例代碼
本文主要介紹了C#實現(xiàn)目錄跳轉(TreeView和SplitContainer)的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2022-07-07