必威体育Betway必威体育官网
当前位置:首页 > IT技术

C#自定义PropertyGrid属性

时间:2019-10-09 04:42:18来源:IT技术作者:seo实验室小编阅读:57次「手机版」
 

propertygrid

网络转载,原文来自:http://blog.csdn.net/lxping1012/article/details/7073944

最近用到了propertygrid,原来从来没用到过,拿在手里,一头雾水,经过一段时间研究后,大概理解了Property的使用方法,下面仔细剖析一下。

PropertyGrid控件就是Visual Studio开发工具里面的属性浏览器,我们在VS里面可以通过属性浏览器查看,修改控件的属性,并主要通过使用反射来检索项目的属性。

一.如何显示属性

1)普通显示

在PropertyGrid中显示属性很容易,我们可以直接给propertyGrid1.SelectedObject属性赋值,SelectObject属性可以获取或设置当前选定的对象,数据类型为object,这就意味着我们可以直接将一个对象赋给它。针对一个对象,它会将对象中的所有公共属性显示在PropertyGrid上。假如我们定义一个Station类,如下

[csharp]view plaincopy

  1. publicclassStation
  2. {
  3. privatestring_StationName;
  4. privatedouble_Lon=103;
  5. privatedouble_Lat=38;
  6. privatecolor_color;
  7. privatestring_file=string.empty;
  8. privateFont_font;
  9. publicstringFileName
  10. {
  11. get{return_file;}
  12. set{_file=value;}
  13. }
  14. publicColorColor
  15. {
  16. get{return_color;}
  17. set{_color=value;}
  18. }
  19. publicFontFont
  20. {
  21. get{return_font;}
  22. set{_font=value;}
  23. }
  24. publicstringStationName
  25. {
  26. get{return_StationName;}
  27. set{_StationName=value;}
  28. }
  29. publicdoubleLon
  30. {
  31. get{return_Lon;}
  32. set{_Lon=value;}
  33. }
  34. publicdoubleLat
  35. {
  36. get{return_Lat;}
  37. set{_Lat=value;}
  38. }
  39. }

[csharp]view plaincopy

  1. publicclassStation
  2. {
  3. privatestring_StationName;
  4. privatedouble_Lon=103;
  5. privatedouble_Lat=38;
  6. privateColor_color;
  7. privatestring_file=string.Empty;
  8. privateFont_font;
  9. publicstringFileName
  10. {
  11. get{return_file;}
  12. set{_file=value;}
  13. }
  14. publicColorColor
  15. {
  16. get{return_color;}
  17. set{_color=value;}
  18. }
  19. publicFontFont
  20. {
  21. get{return_font;}
  22. set{_font=value;}
  23. }
  24. publicstringStationName
  25. {
  26. get{return_StationName;}
  27. set{_StationName=value;}
  28. }
  29. publicdoubleLon
  30. {
  31. get{return_Lon;}
  32. set{_Lon=value;}
  33. }
  34. publicdoubleLat
  35. {
  36. get{return_Lat;}
  37. set{_Lat=value;}
  38. }
  39. }

然后在窗体中拖拉一个PropertyGrid控件propertygrid1,在Form_load中代码如下

[csharp]view plaincopy

  1. privatevoidForm1_Load(objectsender,EventArgse)
  2. {
  3. Stations=newStation();
  4. propertygrid1.SelectObject=s;
  5. }

[csharp]view plaincopy

  1. privatevoidForm1_Load(objectsender,EventArgse)
  2. {
  3. Stations=newStation();
  4. propertygrid1.SelectObject=s;
  5. }

我们就可以看到如下效果:

我们看到属性名显示都是英文,那样很不方便阅读如果我们像显示中文,该如何实现呢?

更改了显示方式

要更改某些属性的显示方式,您可以对这些属性应用不同的特性。特性是用于为类型、字段、方法和属性等编程元素添加批注的声明标记,在运行时可以使用反射对其进行检索。下面列出了其中的一部分:

DescriptionAttribute- 设置显示在属性下方说明帮助窗格中的属性文本。这是一种为活动属性(即具有焦点的属性)提供帮助文本的有效方法。

CategoryAttribute- 设置属性在网格中所属的类别。当您需要将属性按类别名称分组时,此特性非常有用。如果没有为属性指定类别,该属性将被分配给杂项类别。可以将此特性应用于所有属性。

BrowsableAttribute– 表示是否在网格中显示属性。此特性可用于在网格中隐藏属性。默认情况下,公共属性始终显示在网格中。

ReadOnlyAttribute– 表示属性是否为只读。此特性可用于禁止在网格中编辑属性。默认情况下,带有 get 和 set 访问函数的公共属性在网格中是可以编辑的。

DefaultValueAttribute– 表示属性的默认值。如果希望为属性提供默认值,然后确定该属性值是否与默认值相同,则可使用此特性。可以将此特性应用于所有属性。

DefaultPropertyAttribute– 表示类的默认属性。在网格中选择某个类时,将首先突出显示该类的默认属性。

下面我们在Station类中的属性Lon上方添加[CategoryAttribute("坐标"),displayNameAttribute("经度")],效果如下:

如果想要在属性表中添加颜色选择和字体选择那是很容易一件事,可以在Station类中添加Color类型属性,和Font类型属性,绑定后,就可以进行颜色选择和字体选择了,代码在Station中已经实现。

2)自定义显示

我们可以看出这种上面这种显示属性方法并不够灵活,我们不能方便的及时增加或者删除属性。

//属性表管理类

[csharp]view plaincopy

  1. <spanstyle="font-size:13px;">publicclassPropertyManageCls:CollectionBase,ICustomTypeDescriptor
  2. {
  3. publicvoidAdd(Propertyvalue)
  4. {
  5. intflag=-1;
  6. if(value!=null)
  7. {
  8. if(base.List.Count>0)
  9. {
  10. IList<Property>mList=newList<Property>();
  11. for(inti=0;i<base.List.Count;i++)
  12. {
  13. Propertyp=base.List[i]asProperty;
  14. if(value.Name==p.Name)
  15. {
  16. flag=i;
  17. }
  18. mList.Add(p);
  19. }
  20. if(flag==-1)
  21. {
  22. mList.Add(value);
  23. }
  24. base.List.Clear();
  25. foreach(PropertypinmList)
  26. {
  27. base.List.Add(p);
  28. }
  29. }
  30. else
  31. {
  32. base.List.Add(value);
  33. }
  34. }
  35. }
  36. publicvoidRemove(Propertyvalue)
  37. {
  38. if(value!=null&&base.List.Count>0)
  39. base.List.Remove(value);
  40. }
  41. publicPropertythis[intindex]
  42. {
  43. get
  44. {
  45. return(Property)base.List[index];
  46. }
  47. set
  48. {
  49. base.List[index]=(Property)value;
  50. }
  51. }
  52. #regionICustomTypeDescriptor成员
  53. publicAttributeCollectionGetAttributes()
  54. {
  55. returnTypeDescriptor.GetAttributes(this,true);
  56. }
  57. publicstringGetClassName()
  58. {
  59. returnTypeDescriptor.GetClassName(this,true);
  60. }
  61. publicstringGetcomponentname()
  62. {
  63. returnTypeDescriptor.GetComponentName(this,true);
  64. }
  65. publicTypeConverterGetConverter()
  66. {
  67. returnTypeDescriptor.GetConverter(this,true);
  68. }
  69. publicEventDescriptorGetDefaultEvent()
  70. {
  71. returnTypeDescriptor.GetDefaultEvent(this,true);
  72. }
  73. publicPropertyDescriptorGetDefaultProperty()
  74. {
  75. returnTypeDescriptor.GetDefaultProperty(this,true);
  76. }
  77. publicobjectGetEditor(TypeeditorBaseType)
  78. {
  79. returnTypeDescriptor.GetEditor(this,editorBaseType,true);
  80. }
  81. publicEventDescriptorCollectionGetEvents(Attribute[]attributes)
  82. {
  83. returnTypeDescriptor.GetEvents(this,attributes,true);
  84. }
  85. publicEventDescriptorCollectionGetEvents()
  86. {
  87. returnTypeDescriptor.GetEvents(this,true);
  88. }
  89. publicPropertyDescriptorCollectionGetProperties(Attribute[]attributes)
  90. {
  91. PropertyDescriptor[]newProps=newPropertyDescriptor[this.Count];
  92. for(inti=0;i<this.Count;i++)
  93. {
  94. Propertyprop=(Property)this[i];
  95. newProps[i]=newCustomPropertyDescriptor(refprop,attributes);
  96. }
  97. returnnewPropertyDescriptorCollection(newProps);
  98. }
  99. publicPropertyDescriptorCollectionGetProperties()
  100. {
  101. returnTypeDescriptor.GetProperties(this,true);
  102. }
  103. publicobjectGetPropertyOwner(PropertyDescriptorpd)
  104. {
  105. returnthis;
  106. }
  107. #endregion
  108. }
  109. //属性类
  110. publicclassProperty
  111. {
  112. privatestring_name=string.Empty;
  113. privateobject_value=null;
  114. privatebool_readonly=false;
  115. privatebool_visible=true;
  116. privatestring_category=string.Empty;
  117. TypeConverter_converter=null;
  118. object_editor=null;
  119. privatestring_displayname=string.Empty;
  120. publicProperty(stringsName,objectsValue)
  121. {
  122. this._name=sName;
  123. this._value=sValue;
  124. }
  125. publicProperty(stringsName,objectsValue,boolsReadonly,boolsVisible)
  126. {
  127. this._name=sName;
  128. this._value=sValue;
  129. this._readonly=sReadonly;
  130. this._visible=sVisible;
  131. }
  132. publicstringName//获得属性名
  133. {
  134. get
  135. {
  136. return_name;
  137. }
  138. set
  139. {
  140. _name=value;
  141. }
  142. }
  143. publicstringDisplayName//属性显示名称
  144. {
  145. get
  146. {
  147. return_displayname;
  148. }
  149. set
  150. {
  151. _displayname=value;
  152. }
  153. }
  154. publicTypeConverterConverter//类型转换器,我们在制作下拉列表时需要用到
  155. {
  156. get
  157. {
  158. return_converter;
  159. }
  160. set
  161. {
  162. _converter=value;
  163. }
  164. }
  165. publicstringCategory//属性所属类别
  166. {
  167. get
  168. {
  169. return_category;
  170. }
  171. set
  172. {
  173. _category=value;
  174. }
  175. }
  176. publicobjectValue//属性值
  177. {
  178. get
  179. {
  180. return_value;
  181. }
  182. set
  183. {
  184. _value=value;
  185. }
  186. }
  187. publicboolReadOnly//是否为只读属性
  188. {
  189. get
  190. {
  191. return_readonly;
  192. }
  193. set
  194. {
  195. _readonly=value;
  196. }
  197. }
  198. publicboolVisible//是否可见
  199. {
  200. get
  201. {
  202. return_visible;
  203. }
  204. set
  205. {
  206. _visible=value;
  207. }
  208. }
  209. publicvirtualobjectEditor//属性编辑器
  210. {
  211. get
  212. {
  213. return_editor;
  214. }
  215. set
  216. {
  217. _editor=value;
  218. }
  219. }
  220. }
  221. publicclassCustomPropertyDescriptor:PropertyDescriptor
  222. {
  223. Propertym_Property;
  224. publicCustomPropertyDescriptor(refPropertymyProperty,Attribute[]attrs)
  225. :base(myProperty.Name,attrs)
  226. {
  227. m_Property=myProperty;
  228. }
  229. #regionPropertyDescriptor重写方法
  230. publicoverrideboolCanResetValue(objectcomponent)
  231. {
  232. returnfalse;
  233. }
  234. publicoverrideTypeComponentType
  235. {
  236. get
  237. {
  238. returnnull;
  239. }
  240. }
  241. publicoverrideobjectGetValue(objectcomponent)
  242. {
  243. returnm_Property.Value;
  244. }
  245. publicoverridestringDescription
  246. {
  247. get
  248. {
  249. returnm_Property.Name;
  250. }
  251. }
  252. publicoverridestringCategory
  253. {
  254. get
  255. {
  256. returnm_Property.Category;
  257. }
  258. }
  259. publicoverridestringDisplayName
  260. {
  261. get
  262. {
  263. returnm_Property.DisplayName!=""?m_Property.DisplayName:m_Property.Name;
  264. }
  265. }
  266. publicoverrideboolIsReadOnly
  267. {
  268. get
  269. {
  270. returnm_Property.ReadOnly;
  271. }
  272. }
  273. publicoverridevoidResetValue(objectcomponent)
  274. {
  275. //Havetoimplement
  276. }
  277. publicoverrideboolShouldserializeValue(objectcomponent)
  278. {
  279. returnfalse;
  280. }
  281. publicoverridevoidSetValue(objectcomponent,objectvalue)
  282. {
  283. m_Property.Value=value;
  284. }
  285. publicoverrideTypeConverterConverter
  286. {
  287. get
  288. {
  289. returnm_Property.Converter;
  290. }
  291. }
  292. publicoverrideTypePropertyType
  293. {
  294. get{returnm_Property.Value.GetType();}
  295. }
  296. publicoverrideobjectGetEditor(TypeeditorBaseType)
  297. {
  298. returnm_Property.Editor==null?base.GetEditor(editorBaseType):m_Property.Editor;
  299. }
  300. #endregion
  301. }</span>

[csharp]view plaincopy

  1. <spanstyle="font-size:13px;"data-filtered="filtered">publicclassPropertyManageCls:CollectionBase,ICustomTypeDescriptor
  2. {
  3. publicvoidAdd(Propertyvalue)
  4. {
  5. intflag=-1;
  6. if(value!=null)
  7. {
  8. if(base.List.Count>0)
  9. {
  10. IList<Property>mList=newList<Property>();
  11. for(inti=0;i<base.List.Count;i++)
  12. {
  13. Propertyp=base.List[i]asProperty;
  14. if(value.Name==p.Name)
  15. {
  16. flag=i;
  17. }
  18. mList.Add(p);
  19. }
  20. if(flag==-1)
  21. {
  22. mList.Add(value);
  23. }
  24. base.List.Clear();
  25. foreach(PropertypinmList)
  26. {
  27. base.List.Add(p);
  28. }
  29. }
  30. else
  31. {
  32. base.List.Add(value);
  33. }
  34. }
  35. }
  36. publicvoidRemove(Propertyvalue)
  37. {
  38. if(value!=null&&base.List.Count>0)
  39. base.List.Remove(value);
  40. }
  41. publicPropertythis[intindex]
  42. {
  43. get
  44. {
  45. return(Property)base.List[index];
  46. }
  47. set
  48. {
  49. base.List[index]=(Property)value;
  50. }
  51. }
  52. #regionICustomTypeDescriptor成员
  53. publicAttributeCollectionGetAttributes()
  54. {
  55. returnTypeDescriptor.GetAttributes(this,true);
  56. }
  57. publicstringGetClassName()
  58. {
  59. returnTypeDescriptor.GetClassName(this,true);
  60. }
  61. publicstringGetComponentName()
  62. {
  63. returnTypeDescriptor.GetComponentName(this,true);
  64. }
  65. publicTypeConverterGetConverter()
  66. {
  67. returnTypeDescriptor.GetConverter(this,true);
  68. }
  69. publicEventDescriptorGetDefaultEvent()
  70. {
  71. returnTypeDescriptor.GetDefaultEvent(this,true);
  72. }
  73. publicPropertyDescriptorGetDefaultProperty()
  74. {
  75. returnTypeDescriptor.GetDefaultProperty(this,true);
  76. }
  77. publicobjectGetEditor(TypeeditorBaseType)
  78. {
  79. returnTypeDescriptor.GetEditor(this,editorBaseType,true);
  80. }
  81. publicEventDescriptorCollectionGetEvents(Attribute[]attributes)
  82. {
  83. returnTypeDescriptor.GetEvents(this,attributes,true);
  84. }
  85. publicEventDescriptorCollectionGetEvents()
  86. {
  87. returnTypeDescriptor.GetEvents(this,true);
  88. }
  89. publicPropertyDescriptorCollectionGetProperties(Attribute[]attributes)
  90. {
  91. PropertyDescriptor[]newProps=newPropertyDescriptor[this.Count];
  92. for(inti=0;i<this.Count;i++)
  93. {
  94. Propertyprop=(Property)this[i];
  95. newProps[i]=newCustomPropertyDescriptor(refprop,attributes);
  96. }
  97. returnnewPropertyDescriptorCollection(newProps);
  98. }
  99. publicPropertyDescriptorCollectionGetProperties()
  100. {
  101. returnTypeDescriptor.GetProperties(this,true);
  102. }
  103. publicobjectGetPropertyOwner(PropertyDescriptorpd)
  104. {
  105. returnthis;
  106. }
  107. #endregion
  108. }
  109. //属性类
  110. publicclassProperty
  111. {
  112. privatestring_name=string.Empty;
  113. privateobject_value=null;
  114. privatebool_readonly=false;
  115. privatebool_visible=true;
  116. privatestring_category=string.Empty;
  117. TypeConverter_converter=null;
  118. object_editor=null;
  119. privatestring_displayname=string.Empty;
  120. publicProperty(stringsName,objectsValue)
  121. {
  122. this._name=sName;
  123. this._value=sValue;
  124. }
  125. publicProperty(stringsName,objectsValue,boolsReadonly,boolsVisible)
  126. {
  127. this._name=sName;
  128. this._value=sValue;
  129. this._readonly=sReadonly;
  130. this._visible=sVisible;
  131. }
  132. publicstringName//获得属性名
  133. {
  134. get
  135. {
  136. return_name;
  137. }
  138. set
  139. {
  140. _name=value;
  141. }
  142. }
  143. publicstringDisplayName//属性显示名称
  144. {
  145. get
  146. {
  147. return_displayname;
  148. }
  149. set
  150. {
  151. _displayname=value;
  152. }
  153. }
  154. publicTypeConverterConverter//类型转换器,我们在制作下拉列表时需要用到
  155. {
  156. get
  157. {
  158. return_converter;
  159. }
  160. set
  161. {
  162. _converter=value;
  163. }
  164. }
  165. publicstringCategory//属性所属类别
  166. {
  167. get
  168. {
  169. return_category;
  170. }
  171. set
  172. {
  173. _category=value;
  174. }
  175. }
  176. publicobjectValue//属性值
  177. {
  178. get
  179. {
  180. return_value;
  181. }
  182. set
  183. {
  184. _value=value;
  185. }
  186. }
  187. publicboolReadOnly//是否为只读属性
  188. {
  189. get
  190. {
  191. return_readonly;
  192. }
  193. set
  194. {
  195. _readonly=value;
  196. }
  197. }
  198. publicboolVisible//是否可见
  199. {
  200. get
  201. {
  202. return_visible;
  203. }
  204. set
  205. {
  206. _visible=value;
  207. }
  208. }
  209. publicvirtualobjectEditor//属性编辑器
  210. {
  211. get
  212. {
  213. return_editor;
  214. }
  215. set
  216. {
  217. _editor=value;
  218. }
  219. }
  220. }
  221. publicclassCustomPropertyDescriptor:PropertyDescriptor
  222. {
  223. Propertym_Property;
  224. publicCustomPropertyDescriptor(refPropertymyProperty,Attribute[]attrs)
  225. :base(myProperty.Name,attrs)
  226. {
  227. m_Property=myProperty;
  228. }
  229. #regionPropertyDescriptor重写方法
  230. publicoverrideboolCanResetValue(objectcomponent)
  231. {
  232. returnfalse;
  233. }
  234. publicoverrideTypeComponentType
  235. {
  236. get
  237. {
  238. returnnull;
  239. }
  240. }
  241. publicoverrideobjectGetValue(objectcomponent)
  242. {
  243. returnm_Property.Value;
  244. }
  245. publicoverridestringDescription
  246. {
  247. get
  248. {
  249. returnm_Property.Name;
  250. }
  251. }
  252. publicoverridestringCategory
  253. {
  254. get
  255. {
  256. returnm_Property.Category;
  257. }
  258. }
  259. publicoverridestringDisplayName
  260. {
  261. get
  262. {
  263. returnm_Property.DisplayName!=""?m_Property.DisplayName:m_Property.Name;
  264. }
  265. }
  266. publicoverrideboolIsReadOnly
  267. {
  268. get
  269. {
  270. returnm_Property.ReadOnly;
  271. }
  272. }
  273. publicoverridevoidResetValue(objectcomponent)
  274. {
  275. //Havetoimplement
  276. }
  277. publicoverrideboolShouldSerializeValue(objectcomponent)
  278. {
  279. returnfalse;
  280. }
  281. publicoverridevoidSetValue(objectcomponent,objectvalue)
  282. {
  283. m_Property.Value=value;
  284. }
  285. publicoverrideTypeConverterConverter
  286. {
  287. get
  288. {
  289. returnm_Property.Converter;
  290. }
  291. }
  292. publicoverrideTypePropertyType
  293. {
  294. get{returnm_Property.Value.GetType();}
  295. }
  296. publicoverrideobjectGetEditor(TypeeditorBaseType)
  297. {
  298. returnm_Property.Editor==null?base.GetEditor(editorBaseType):m_Property.Editor;
  299. }
  300. #endregion
  301. }</span>

下面我们来看看该如何使用,我们仍然在Form_load中添加代码如下:

[csharp]view plaincopy

  1. <spanstyle="font-size:13px;">PropertyManageClspmc=newPropertyManageCls();
  2. Propertypp=newProperty("ID","1",false,true);
  3. pp.Category="基本信息";
  4. pp.DisplayName="我的ID";
  5. pmc.Add(pp);
  6. propertyGrid1.SelectObject=pmc;</span>

[csharp]view plaincopy

  1. <spanstyle="font-size:13px;"data-filtered="filtered">PropertyManageClspmc=newPropertyManageCls();
  2. Propertypp=newProperty("ID","1",false,true);
  3. pp.Category="基本信息";
  4. pp.DisplayName="我的ID";
  5. pmc.Add(pp);
  6. propertyGrid1.SelectObject=pmc;</span>

显示结果:

我们可以看到上面的属性显示很简单,如果想要自定义一个下拉框,或者有一个路径选择的该怎么办呢。

1)类型转换器

要实现下拉框的方法:使用类型转换器,需要继承与TypeConverter或者StringConverter,然后重写方法,代码如下:

[csharp]view plaincopy

  1. <spanstyle="font-size:13px;">//下拉框类型转换器
  2. publicclassDropDownListConverter:StringConverter
  3. {
  4. object[]m_Objects;
  5. publicDropDownListConverter(object[]objects)
  6. {
  7. m_Objects=objects;
  8. }
  9. publicoverrideboolGetStandardValuesSupported(ITypeDescriptorcontextcontext)
  10. {
  11. returntrue;
  12. }
  13. publicoverrideboolGetStandardValuesExclusive(ITypeDescriptorContextcontext)
  14. {
  15. returntrue;</span><spanstyle='color:rgb(0,130,0);line-height:15.39px;font-family:Consolas,"BitstreamVeraSansMono","CourierNew",Courier,monospace;font-size:14px;'>//true下拉框不可编辑</span><spanstyle="font-size:13px;">
  16. </span><spanstyle="font-size:13px;">
  17. }
  18. publicoverride
  19. System.ComponentModel.TypeConverter.StandardValuesCollectionGetStandardValues(ITypeDescriptorContextcontext)
  20. {
  21. returnnewStandardValuesCollection(m_Objects);//我们可以直接在内部定义一个数组,但并不建议这样做,这样对于下拉框的灵活//性有很大影响
  22. }
  23. }</span>

[csharp]view plaincopy

  1. <spanstyle="font-size:13px;"data-filtered="filtered">//下拉框类型转换器
  2. publicclassDropDownListConverter:StringConverter
  3. {
  4. object[]m_Objects;
  5. publicDropDownListConverter(object[]objects)
  6. {
  7. m_Objects=objects;
  8. }
  9. publicoverrideboolGetStandardValuesSupported(ITypeDescriptorContextcontext)
  10. {
  11. returntrue;
  12. }
  13. publicoverrideboolGetStandardValuesExclusive(ITypeDescriptorContextcontext)
  14. {
  15. returntrue;</span><spanstyle="font-family:Consolas,'BitstreamVeraSansMono','CourierNew',Courier,monospace;font-size:14px;color:#0820;line-height:15.39px;"data-filtered="filtered">//true下拉框不可编辑</span><spanstyle="font-size:13px;"data-filtered="filtered">
  16. </span><spanstyle="font-size:13px;"data-filtered="filtered">
  17. }
  18. publicoverride
  19. System.ComponentModel.TypeConverter.StandardValuesCollectionGetStandardValues(ITypeDescriptorContextcontext)
  20. {
  21. returnnewStandardValuesCollection(m_Objects);//我们可以直接在内部定义一个数组,但并不建议这样做,这样对于下拉框的灵活//性有很大影响
  22. }
  23. }</span>

我们实现了下拉框类型转换器,但该如何使用呢?

使用方法一:我们仍然以Station类作为例子,在属性上方添加标记[TypeConverter(typeof(DropDownListConverter))],但在这种情况下,我们需要预先在DropDownListConverter中定义下拉框内容

使用方法二:这种方法我们可以在外部定义数组,使用方便,使用方法代码如下:

[csharp]view plaincopy

  1. <spanstyle="color:rgb(51,51,51);font-family:Arial;"><spanstyle="font-size:13px;">privatevoidForm_load(objectsender,EventArgse)
  2. {
  3. PropertyManageClspmc=newPropertyManageCls();
  4. string[]s=newstring[]{"1","2","3","4"};
  5. Propertypp=newProperty(txtname.Text,txtvalue.Text,false,true);
  6. pp.Category="基本信息";
  7. pp.DisplayName="我的ID";
  8. pp.Converter=newDropDownListConverter(s);//Property的Converter属性就可以设置类型转换
  9. pmc.Add(pp);
  10. propertyGrid1.SelectObject=pmc;
  11. }</span></span>

[csharp]view plaincopy

  1. <spanstyle="font-family:Arial;color:#333333;"data-filtered="filtered"><spanstyle="font-size:13px;"data-filtered="filtered">privatevoidForm_load(objectsender,EventArgse)
  2. {
  3. PropertyManageClspmc=newPropertyManageCls();
  4. string[]s=newstring[]{"1","2","3","4"};
  5. Propertypp=newProperty(txtname.Text,txtvalue.Text,false,true);
  6. pp.Category="基本信息";
  7. pp.DisplayName="我的ID";
  8. pp.Converter=newDropDownListConverter(s);//Property的Converter属性就可以设置类型转换
  9. pmc.Add(pp);
  10. propertyGrid1.SelectObject=pmc;
  11. }</span></span>

效果图:

2)属性编辑器

使用属性编辑器实现路径选择:属性编辑器需要继承与UITypeEditor

[csharp]view plaincopy

  1. <spanstyle="font-size:13px;">//文件路径选择publicclassPropertyGridFileItem:UITypeEditor
  2. {
  3. publicoverrideUITypeEditorEditStyleGetEditStyle(System.ComponentModel.ITypeDescriptorContextcontext)
  4. {
  5. returnUITypeEditorEditStyle.Modal;
  6. }
  7. publicoverrideobjectEditValue(System.ComponentModel.ITypeDescriptorContextcontext,System.
  8. IServiceProviderprovider,objectvalue)
  9. {
  10. IwindowsFormsEditorServiceedSvc=
  11. (IWindowsFormsEditorService)provider.GetService(typeof(IWindowsFormsEditorService));
  12. if(edSvc!=null)
  13. {
  14. //可以打开任何特定的对话框
  15. OpenFileDialogdialog=newOpenFileDialog();
  16. dialog.AddExtension=false;
  17. if(dialog.ShowDialog().Equals(dialogresult.OK))
  18. {
  19. returndialog.FileName;
  20. }
  21. }
  22. returnvalue;
  23. }
  24. }</span>

[csharp]view plaincopy

  1. <spanstyle="font-size:13px;"data-filtered="filtered">//文件路径选择publicclassPropertyGridFileItem:UITypeEditor
  2. {
  3. publicoverrideUITypeEditorEditStyleGetEditStyle(System.ComponentModel.ITypeDescriptorContextcontext)
  4. {
  5. returnUITypeEditorEditStyle.Modal;
  6. }
  7. publicoverrideobjectEditValue(System.ComponentModel.ITypeDescriptorContextcontext,System.
  8. IServiceProviderprovider,objectvalue)
  9. {
  10. IWindowsFormsEditorServiceedSvc=
  11. (IWindowsFormsEditorService)provider.GetService(typeof(IWindowsFormsEditorService));
  12. if(edSvc!=null)
  13. {
  14. //可以打开任何特定的对话框
  15. OpenFileDialogdialog=newOpenFileDialog();
  16. dialog.AddExtension=false;
  17. if(dialog.ShowDialog().Equals(DialogResult.OK))
  18. {
  19. returndialog.FileName;
  20. }
  21. }
  22. returnvalue;
  23. }
  24. }</span>

使用方法一:以Station类为例,在属性上方添加标记[EditorAttribute(typeof(PropertyGridFileItem),

typeof(System.Drawing.Design.UITypeEditor))],然后将PropertyGrid的SelectObject等于Station实例就可以了;

使用方法二:使用方法代码如下:

[csharp]view plaincopy

  1. <spanstyle="font-size:13px;">privatevoidForm_load(objectsender,EventArgse)
  2. {
  3. PropertyManageClspmc=newPropertyManageCls();
  4. Propertypp=newProperty(txtname.Text,txtvalue.Text,false,true);
  5. pp.Category="基本信息";
  6. pp.DisplayName="我的ID";
  7. pp.Editor=newPropertyGridFileItem();//Property的Editor属性就可以设置属性编辑
  8. pmc.Add(pp);
  9. propertyGrid1.SelectObject=pmc;
  10. }</span>

[csharp]view plaincopy

  1. <spanstyle="font-size:13px;"data-filtered="filtered">privatevoidForm_load(objectsender,EventArgse)
  2. {
  3. PropertyManageClspmc=newPropertyManageCls();
  4. Propertypp=newProperty(txtname.Text,txtvalue.Text,false,true);
  5. pp.Category="基本信息";
  6. pp.DisplayName="我的ID";
  7. pp.Editor=newPropertyGridFileItem();//Property的Editor属性就可以设置属性编辑
  8. pmc.Add(pp);
  9. propertyGrid1.SelectObject=pmc;
  10. }</span>

效果图如下:

通过以上方法我们可以满足一些基本需求想要了解更多,可以看以下链接:

PropertyGrid控件心得

http://blog.csdn.net/luyifeiniu/article/details/5426960#创建 PropertyGrid 控件

Customized display of collection data in a PropertyGrid

http://www.codeproject.com/KB/tabs/customizingcollectiondata.aspx

TypeConverter的层次结构

http://msdn.microsoft.com/en-us/library/8cexyz1e

关于PropertyGrid中属性的值动态从数据库取出

http://topic.csdn.net/u/20100827/11/5524219a-4457-4921-b8f2-b4c63bc6b016.html

动态可订制属性的 PropertyGrid

http://blog.csdn.net/akron/article/details/2750566

转自http://blog.csdn.net/lxping1012/article/details/7073944

相关阅读

关于属性描述符PropertyDescriptor

本文首发于本博客 猫叔的博客,转载请申明出处 前言 感谢GY丶L粉丝的提问:属性描述器PropertyDescriptor是干嘛

属性总结(一):marker

官方文档:https://matplotlib.org/api/markers_api.html?highlight=marker#module-matplotlib.markers 序号 标记 说明 序号 标

CSS background-image属性

但凡牛掰人物出场,都伴随着“Duang”的特技,它们会不停的加特技,加特技,加特技。CSS背景图片的background-image就是这样一位牛人,它一

div自定义设置滚动条样式

示例 效果 CSS myp{ max-height:910px; overflow:auto; } myp::-webkit-scrollbar{ width:8px; hei

C#中List怎么用?List基础用法汇总

注:本文章转载自:http://www.33lc.com/article/7364.htmlC#中的List怎么样?List<T>类是ArrayList类的泛型等效类,该类使用大小可按需

分享到:

栏目导航

推荐阅读

热门阅读