日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

动态可订制属性的 PropertyGrid(转载)

發(fā)布時間:2025/7/14 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 动态可订制属性的 PropertyGrid(转载) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

在VB6, VC++, C#.net?里都可以見到一個屬性設(shè)計器,用來編輯修改?object?的屬性。C#?下提供了一個屬性設(shè)計器?PropertyGrid,?其使用極其簡單,只要

?

??????grid.SelectedObject?=?myOjbect;

?

就可以把myOjbect?的所有屬性顯示出來。不過很多時候我們不希望如此,因為欠缺一種靈活性。我希望可以自由的控制需要編輯的內(nèi)容。能做的這一點,再配合可編輯的?ListView,?可以很好的解決復雜內(nèi)容的修改編輯問題。

?

首先是定義一個CProperty,?用來設(shè)置?object?在PropertyGrid?中的內(nèi)容,?還得定義一個實現(xiàn)ICustomTypeDescriptor?接口的容器CPropertyCollection,?最后定制一個?PropertyDescriptor,?用來描述?PropertyGrid?接口方法。

?

?

???????public?class?CPropertyCollection?:?CCollection<CProperty>,?ICustomTypeDescriptor

???????{

??????????????public?void?Add(CProperty?value)

??????????????{

?????????????????????base.Put(value.Name, value);

??????????????}

?

??????????????#region?"TypeDescriptor"

?

??????????????public?String?GetClassName()

??????????????{

?????????????????????return?TypeDescriptor.GetClassName(this,?true);

??????????????}

?

??????????????public?AttributeCollection?GetAttributes()

??????????????{

?????????????????????return?TypeDescriptor.GetAttributes(this,?true);

??????????????}

?

??????????????public?String?GetComponentName()

??????????????{

?????????????????????return?TypeDescriptor.GetComponentName(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)

??????????????{

?????????????????????PropertyDescriptor[] propDes?=?new?PropertyDescriptor[this.Count];

?????????????????????for?(int?i?=?0; i?<?this.Count; i++) {

????????????????????????????CProperty?prop?=?(CProperty)?this[i];

????????????????????????????propDes[i]?=?new?CPropertyDescriptor(ref?prop, attributes);

?????????????????????}

?????????????????????return?new?PropertyDescriptorCollection(propDes);

??????????????}

?

??????????????public?PropertyDescriptorCollection?GetProperties()

??????????????{

?????????????????????return?TypeDescriptor.GetProperties(this,?true);

??????????????}

?

??????????????public?object?GetPropertyOwner(PropertyDescriptor?pd)

??????????????{

?????????????????????return?this;

??????????????}

??????????????#endregion

???????}

?

???????public?class?CProperty

???????{

??????????????private?string?m_Name?=?string.Empty;

??????????????private?bool?m_bReadOnly?=?false;

??????????????private?bool?m_bVisible?=?true;

??????????????private?object?m_Value?=?null;

??????????????private?string?m_Category?=?string.Empty;

??????????????TypeConverter?m_Converter?=?null;

??????????????object?m_Editor?=?null;

?

?

??????????????public?CProperty(string?name,?object?value)

??????????????{

?????????????????????m_Name?=?name;

?????????????????????m_Value?=?value;

??????????????}

?

??????????????public?CProperty(string?name,?object?value,?bool?bReadOnly,?bool?bVisible)

??????????????{

?????????????????????m_Name?=?name;

?????????????????????m_Value?=?value;

?????????????????????m_bReadOnly?=?bReadOnly;

?????????????????????m_bVisible?=?bVisible;

??????????????}

?

??????????????public?bool?ReadOnly

??????????????{

?????????????????????get?{?return?m_bReadOnly; }

?????????????????????set?{ m_bReadOnly?=?value; }

??????????????}

?

??????????????public?virtual?TypeConverter?Converter

??????????????{

?????????????????????get?{?return?m_Converter; }

?????????????????????set?{ m_Converter?=?value; }

??????????????}

?

??????????????public?string?Name

??????????????{

?????????????????????get?{?return?m_Name; }

?????????????????????set?{ m_Name?=?value; }

??????????????}

?

??????????????public?bool?Visible

??????????????{

?????????????????????get?{?return?m_bVisible; }

?????????????????????set?{ m_bVisible?=?value; }

??????????????}

?

??????????????public?virtual?object?Value

??????????????{

?????????????????????get?{?return?m_Value; }

?????????????????????set?{ m_Value?=?value; }

??????????????}

?

??????????????public?string?Category

??????????????{

?????????????????????get?{?return?m_Category; }

?????????????????????set?{ m_Category?=?value; }

??????????????}

?

??????????????public?virtual?object?Editor

??????????????{

?????????????????????get?{?return?m_Editor; }

?????????????????????set?{ m_Editor?=?value;??}

??????????????}

???????}

?

?

???????public?class?CPropertyDescriptor?:?PropertyDescriptor

???????{

??????????????CProperty?m_Property;

?

??????????????public?CPropertyDescriptor(ref?CProperty?property,?Attribute[] attrs)

?????????????????????:?base(property.Name, attrs)

??????????????{

?????????????????????m_Property?=?property;

??????????????}

?

??????????????#region?PropertyDescriptor "region"

?

??????????????public?override?bool?CanResetValue(object?component)

??????????????{

?????????????????????return?false;

??????????????}

?

??????????????public?override?Type?ComponentType

??????????????{

?????????????????????get?{?return?null; }

??????????????}

?

??????????????public?override?object?GetValue(object?component)

??????????????{

?????????????????????return?m_Property.Value;

??????????????}

?

??????????????public?override?string?Description

??????????????{

?????????????????????get?{?return?m_Property.Name; }

??????????????}

?

??????????????public?override?string?Category

??????????????{

?????????????????????get?{?return?m_Property.Category; }

??????????????}

?

??????????????public?override?string?DisplayName

??????????????{

?????????????????????get?{?return?m_Property.Name; }

??????????????}

?

??????????????public?override?bool?IsReadOnly

??????????????{

?????????????????????get?{?return?m_Property.ReadOnly; }

??????????????}

?

??????????????public?override?TypeConverter?Converter

??????????????{

?????????????????????get?{?return?m_Property.Converter; }

??????????????}

?

??????????????public?override?void?ResetValue(object?component)

??????????????{

??????????????}

?

??????????????public?override?bool?ShouldSerializeValue(object?component)

??????????????{

?????????????????????return?false;

??????????????}

?

??????????????public?override?void?SetValue(object?component,?object?value)

??????????????{

?????????????????????m_Property.Value?=?value;

??????????????}

?

??????????????public?override?Type?PropertyType

??????????????{

?????????????????????get?{?return?m_Property.Value.GetType(); }

??????????????}

?

??????????????public?override?object?GetEditor(Type?editorBaseType)

??????????????{

?????????????????????return?m_Property.Editor?==?null???base.GetEditor(editorBaseType) : m_Property.Editor;

??????????????}

??????????????#endregion

???????}

?

?

?

下面的事情變得很簡單:

?

???????private?void?Form_Load(object?sender,?EventArgs?e)

??????????????{

?????????????????????CProperty?myProp1?=?new?CProperty("Test1",?"test");

?????????????????????MyProp1.Category?=?"test";

?????????????????????CProperty?myProp2?=?new?CProperty("Test2",?1);

?????????????????????myProp2.Editor = new System.Drawing.Design.ColorEditor();

?????????????????????myProperties.Add(myProp1);

?????????????????????myProperties.Add(myProp2);

?????????????????????grid.SelectedObject?=?myProperties;

??????????????}

?

?

可以看到通過CProperty.Editor?可以使用各種的編輯器,甚至自定義的編輯器(從?UITypeEditor?派生,msdn中有例子)。另一個要點是CProperty.Converter,?用來自定義如何進行類型轉(zhuǎn)換,例如,enum?類型在PropertyGrid?中用?List?編輯,如果不想事先定義一個?enum,?可以用自己的?TypeConverter?來實現(xiàn)功能更強大的編輯方法。

?

???????public?class?ListConverter?:?StringConverter

???????{

??????????????object[] m_Objects;

??????????????public?ListConverter(object[] objects)

??????????????{

?????????????????????m_Objects?=?objects;

??????????????}

?

??????????????public?override?bool?GetStandardValuesSupported(ITypeDescriptorContext?context)

??????????????{

?????????????????????return?true;

??????????????}

??????????????public?override?bool?GetStandardValuesExclusive(ITypeDescriptorContext?context)

??????????????{

?????????????????????return?true;

??????????????}

?

??????????????public?override

??????????????System.ComponentModel.TypeConverter.StandardValuesCollection?GetStandardValues(ITypeDescriptorContext?context)

??????????????{

?????????????????????return?new?StandardValuesCollection(m_Objects);

??????????????}

???????}?

?

使用ListConverter:

?

????????????CProperty?myProp?=?new?CProperty("Test",?"test2");

????????????myProp.Converter?=?new?ListConverter(new?string[] {?"test1",?"test2","test3"?});

?

?

當click?屬性?Test?時,會彈出一個?List?框。重載?TypeConverter?的?ConvertTo and ConvertFrom?可以獲得更多的功能。

轉(zhuǎn)載于:https://www.cnblogs.com/Joetao/articles/5432316.html

總結(jié)

以上是生活随笔為你收集整理的动态可订制属性的 PropertyGrid(转载)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 美国一级黄色大片 | 欧美肉大捧一进一出免费视频 | 色狠狠操 | 中文字幕高清在线播放 | 山村大伦淫第1部分阅读小说 | 亚洲天堂av一区 | 日韩天堂av| 日韩精品极品视频在线观看免费 | 亚洲青色在线 | 成年免费在线观看 | 亚洲一区二区三区四区五区六区 | 久久免费的精品国产v∧ | 久久亚洲精品国产 | 国产精品久久久久久亚洲av | 韩国三级在线看 | 蜜桃av在线看 | 在线视频第一页 | 在哪里可以看毛片 | 亚洲精品av中文字幕在线在线 | 成人教育av在线 | 欧美国产91| 欧美国产91 | 亚洲免费在线观看视频 | 韩国av电影网站 | 女人色极品影院 | 视频在线观看网站免费 | 奇米在线观看 | 美女丝袜合集 | 一亲二脱三插 | 日日躁夜夜躁白天躁晚上躁91 | 男男车车的车车网站w98免费 | 亚洲日b视频 | 98国产精品 | 丰满大肥婆肥奶大屁股 | 国产黄色在线观看 | 天堂中文8 | 在线看国产精品 | 懂色av蜜臀av粉嫩av分享 | 亚洲激情区 | 91天天射 | 国产一级高清视频 | 国产男女无套免费网站 | 色老头一区二区三区在线观看 | 欧美日韩国产传媒 | 日本wwwxxx| 无码人妻精品一区二区三 | 久久成年| 美足av电影 | www.婷婷.com | 片黄在线观看 | 一区精品在线观看 | 久久人人爽爽 | av之家在线 | 大又大又粗又硬又爽少妇毛片 | 国产极品美女高潮无套在线观看 | 欧美成人a视频 | 欧美黄视频在线观看 | 国产一区二区三区四区五区在线 | 亚洲丁香色| 久久午夜激情 | 欧美中文网 | 国产伦精品一区二区三区妓女下载 | 免费看日批 | 久操视频免费在线观看 | 欧美日韩国产大片 | 91偷拍网站 | a级国产毛片 | 成人av免费在线播放 | 亚洲欧美自偷自拍 | 在线观看视频一区二区 | 久久精品国产欧美亚洲人人爽 | 91精品国产综合久久久久久 | 亚洲国产欧美在线观看 | 国产在线视频在线观看 | 精彩视频一区二区 | 亚洲精品人 | 中文字幕视频网站 | 国产精品区二区三区日本 | 天天艹av | 超碰超碰超碰超碰超碰 | 天天玩天天操 | 香港三级日本三级韩国三级 | 国内自拍第一页 | 91麻豆视频网站 | 日韩欧美国产另类 | 寂寞少妇让水电工爽hd | 免费看欧美黄色片 | 亚洲精品成人无码熟妇在线 | 午夜国产 | 成人影视在线看 | 乌克兰性极品xxxhd | www.haoav| 人人澡人人干 | 国产一级久久久 | 国产精品v欧美精品v日韩精品 | 天堂精品一区 | 国产有码在线观看 | 三级网站视频 | 国产中文字幕在线 |