C#_PropertyGrid控件应用.doc_第1页
C#_PropertyGrid控件应用.doc_第2页
C#_PropertyGrid控件应用.doc_第3页
C#_PropertyGrid控件应用.doc_第4页
C#_PropertyGrid控件应用.doc_第5页
已阅读5页,还剩37页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

最近项目中做一模块时偶发奇想,希望使用propertygrid的控件实现类似visual studio的属性样式,于是拿来一用,发现还真不是自己想象的那么简单,如果要实现一个比较好的展示,还真的需要不少技巧,通过自己的实践和网络的力量,“逢山开道,遇水搭桥”,总算是摸出一些门道,不敢私藏,拿出来与大家分享,呵呵。先来转一个基础的,源自msdn/taiwan/msdn/library/2002/Jul-2002/article/usingpropgrid.htm摘要:本文旨在帮助您了解 Microsoft .NET 框架中的 PropertyGrid 控件,以及如何针对您的应用程序自定义该控件。适用于: Microsoft .NET 框架 Microsoft Visual Studio .NET目录PropertyGrid 控件简介创建 PropertyGrid 控件何处使用 PropertyGrid 控件选择对象自定义 PropertyGrid 控件显示复杂属性为属性提供自定义 UIPropertyGrid 控件简介如果您使用过 Microsoft Visual Basic 或 Microsoft Visual Studio .NET,那么您一定使用过属性浏览器来浏览、查看和编辑一个或多个对象的属性。.NET 框架PropertyGrid控件是 Visual Studio .NET 属性浏览器的核心。PropertyGrid控件显示对象或类型的属性,并主要通过使用反射来检索项目的属性。(反射是在运行时提供类型信息的技术。)下面的屏幕快照显示了PropertyGrid在窗体上的外观。图 1:窗体上的 PropertyGridPropertyGrid包含以下部分: 属性 可展开属性 属性类别标题 属性说明 属性编辑器 属性选项卡 命令窗格(显示控件设计器提供的设计器操作) 创建 PropertyGrid 控件要使用 Visual Studio .NET 创建PropertyGrid控件,需要将该控件添加到工具箱中,因为默认情况下并不包含该控件。在Tools(工具)菜单中,选择Customize Toolbox(自定义工具箱)。在对话框中选择Framework Components(框架组件)选项卡,然后选择PropertyGrid。如果您从命令行编译代码,请使用/reference选项并指定 System.Windows.Forms.dll。以下代码显示了如何创建PropertyGrid控件并将其添加到窗体中。view plaincopy to clipboardprint? usingSystem; usingSystem.Drawing; usingSystem.ComponentModel; usingSystem.Windows.Forms; usingSystem.Globalization; publicclassOptionsDialog:System.Windows.Forms.Form privateSystem.Windows.Forms.PropertyGridOptionsPropertyGrid; publicOptionsDialog() OptionsPropertyGrid=newPropertyGrid(); OptionsPropertyGrid.Size=newSize(300,250); this.Controls.Add(OptionsPropertyGrid); this.Text=选项对话框; STAThread staticvoidMain() Application.Run(newOptionsDialog(); 何处使用 PropertyGrid 控件在应用程序中的很多地方,您都可以使用户与PropertyGrid进行交互,从而获得更丰富的编辑体验。例如,某个应用程序包含多个用户可以设置的“设置”或选项,其中一些可能十分复杂。您可以使用单选按钮、组合框或文本框来表示这些选项。但本文将逐步介绍如何使用PropertyGrid控件创建选项窗口来设置应用程序选项。上面所创建的OptionsDialog窗体即是选项窗口的开始。现在,我们创建一个名为AppSettings的类,其中包含映射到应用程序设置的所有属性。如果创建单独的类而不使用多个分散的变量,设置将更便于管理和维护。 view plaincopy to clipboardprint? publicclassAppSettings privateboolsaveOnClose=true; privatestringgreetingText=欢迎使用应用程序!; privateintitemsInMRU=4; privateintmaxRepeatRate=10; privateboolsettingsChanged=false; privatestringappVersion=1.0; publicboolSaveOnClose getreturnsaveOnClose; setsaveOnClose=value; publicstringGreetingText getreturngreetingText; setgreetingText=value; publicintMaxRepeatRate getreturnmaxRepeatRate; setmaxRepeatRate=value; publicintItemsInMRUList getreturnitemsInMRU; setitemsInMRU=value; publicboolSettingsChanged getreturnsettingsChanged; setsettingsChanged=value; publicstringAppVersion getreturnappVersion; setappVersion=value; 选项窗口上的PropertyGrid将使用此类,因此请将类定义添加到应用程序项目中,在添加时可创建新文件或将其添加到现有窗体源代码的下方。选择对象要标识PropertyGrid显示的内容,请将PropertyGrid.SelectedObject属性设置为一个对象实例。然后,PropertyGrid将完成其余的工作。每次设置SelectedObject时,PropertyGrid都会刷新显示的属性。这提供了一种简单的方法来强制刷新属性,或在运行时切换对象。您还可以调用PropertyGrid.Refresh方法来刷新属性。接下来,您需要更新OptionsDialog构造函数中的代码,以创建一个AppSettings对象,并将其设置为PropertyGrid.SelectedObject属性的值。view plaincopy to clipboardprint? publicOptionsDialog() OptionsPropertyGrid=newPropertyGrid(); OptionsPropertyGrid.Size=newSize(300,250); this.Controls.Add(OptionsPropertyGrid); this.Text=选项对话框; /创建AppSettings类并在PropertyGrid中显示该类。 AppSettingsappset=newAppSettings(); OptionsPropertyGrid.SelectedObject=appset; 编译并运行该应用程序。下面的屏幕快照显示了应用程序的外观。图 2:PropertyGrid 中选定的 AppSettings 类自定义 PropertyGrid 控件您可以修改PropertyGrid的某些外观特征以满足自己的需要。可以更改某些属性的显示方式,甚至选择不显示某些属性。那么,如何对PropertyGrid进行自定义呢?更改 PropertyGrid 的外观特征PropertyGrid的许多外观特征都可以自定义。下面列出了其中的一部分: 通过HelpBackColor、HelpForeColor和HelpVisible属性可以更改背景颜色、更改字体颜色或隐藏说明窗格。 通过ToolbarVisible属性可以隐藏工具栏,通过BackColor属性可以更改工具栏的颜色,通过LargeButtons属性可以显示大工具栏按钮。 使用PropertySort属性可以按字母顺序对属性进行排序和分类。 通过BackColor属性可以更改拆分器的颜色。 通过LineColor属性可以更改网格线和边框。 本示例中的选项窗口不需要工具栏,因此可以将ToolbarVisible设置为false。其余属性均保留默认设置。更改属性的显示方式要更改某些属性的显示方式,您可以对这些属性应用不同的特性。特性是用于为类型、字段、方法和属性等编程元素添加批注的声明标记,在运行时可以使用反射对其进行检索。下面列出了其中的一部分: DescriptionAttribute- 设置显示在属性下方说明帮助窗格中的属性文本。这是一种为活动属性(即具有焦点的属性)提供帮助文本的有效方法。可以将此特性应用于MaxRepeatRate属性。 CategoryAttribute- 设置属性在网格中所属的类别。当您需要将属性按类别名称分组时,此特性非常有用。如果没有为属性指定类别,该属性将被分配给杂项类别。可以将此特性应用于所有属性。 BrowsableAttribute 表示是否在网格中显示属性。此特性可用于在网格中隐藏属性。默认情况下,公共属性始终显示在网格中。可以将此特性应用于SettingsChanged属性。 ReadOnlyAttribute 表示属性是否为只读。此特性可用于禁止在网格中编辑属性。默认情况下,带有 get 和 set 访问函数的公共属性在网格中是可以编辑的。可以将此特性应用于AppVersion属性。 DefaultValueAttribute 表示属性的默认值。如果希望为属性提供默认值,然后确定该属性值是否与默认值相同,则可使用此特性。可以将此特性应用于所有属性。 DefaultPropertyAttribute 表示类的默认属性。在网格中选择某个类时,将首先突出显示该类的默认属性。可以将此特性应用于AppSettings类。 现在,我们将其中的一些特性应用于AppSettings类,以更改属性在PropertyGrid中的显示方式。view plaincopy to clipboardprint? DefaultPropertyAttribute(SaveOnClose) publicclassAppSettings privateboolsaveOnClose=true; privatestringgreetingText=欢迎使用应用程序!; privateintmaxRepeatRate=10; privateintitemsInMRU=4; privateboolsettingsChanged=false; privatestringappVersion=1.0; CategoryAttribute(文档设置), DefaultValueAttribute(true) publicboolSaveOnClose getreturnsaveOnClose; setsaveOnClose=value; CategoryAttribute(全局设置), ReadOnlyAttribute(true), DefaultValueAttribute(欢迎使用应用程序!) publicstringGreetingText getreturngreetingText; setgreetingText=value; CategoryAttribute(全局设置), DefaultValueAttribute(4) publicintItemsInMRUList getreturnitemsInMRU; setitemsInMRU=value; DescriptionAttribute(以毫秒表示的文本重复率。), CategoryAttribute(全局设置), DefaultValueAttribute(10) publicintMaxRepeatRate getreturnmaxRepeatRate; setmaxRepeatRate=value; BrowsableAttribute(false), DefaultValueAttribute(false) publicboolSettingsChanged getreturnsettingsChanged; setsettingsChanged=value; CategoryAttribute(版本), DefaultValueAttribute(1.0), ReadOnlyAttribute(true) publicstringAppVersion getreturnappVersion; setappVersion=value; 将这些特性应用于AppSettings类后,编译并运行该应用程序。下面的屏幕快照显示了应用程序的外观。图 3:PropertyGrid 中显示的带有类别和默认值的属性使用此版本的选项窗口后,您会注意到以下几点: 显示窗口时,将首先突出显示SaveOnClose属性。 选中MaxRepeatRate属性时,说明帮助窗格中将显示“以毫秒表示的文本重复率”。 SaveOnClose属性显示在“文档设置”类别下。其他属性分别显示在“全局设置”和“版本”类别下。 SettingsChanged属性将不再显示。 AppVersion属性为只读。只读属性以灰显文本显示。 如果SaveOnClose属性包含的值不是true,该值将以粗体显示。PropertyGrid使用粗体文本表示包含非默认值的属性。 显示复杂属性到现在为止,选项窗口显示的都是简单的类型,如整数、布尔值和字符串。那么,如何显示更复杂的类型呢?如果应用程序需要跟踪窗口大小、文档字体或工具栏颜色等信息,该如何处理呢?.NET 框架提供的某些数据类型具有特殊的显示功能,能使这些类型在PropertyGrid中更具可用性。对所提供类型的支持首先,请更新AppSettings类,为窗口大小(Size 类型)、窗口字体(Font 类型)和工具栏颜色(Color 类型)添加新属性。view plaincopy to clipboardprint? DefaultPropertyAttribute(SaveOnClose) publicclassAppSettings privateboolsaveOnClose=true; privatestringgreetingText=欢迎使用应用程序!; privateintmaxRepeatRate=10; privateintitemsInMRU=4; privateboolsettingsChanged=false; privatestringappVersion=1.0; privateSizewindowSize=newSize(100,100); privateFontwindowFont=newFont(宋体,9,FontStyle.Regular); privateColortoolbarColor=SystemColors.Control; CategoryAttribute(文档设置), DefaultValueAttribute(true) publicboolSaveOnClose getreturnsaveOnClose; setsaveOnClose=value; CategoryAttribute(文档设置) publicSizeWindowSize getreturnwindowSize; setwindowSize=value; CategoryAttribute(文档设置) publicFontWindowFont getreturnwindowFont; setwindowFont=value; CategoryAttribute(全局设置) publicColorToolbarColor getreturntoolbarColor; settoolbarColor=value; CategoryAttribute(全局设置), ReadOnlyAttribute(true), DefaultValueAttribute(欢迎使用应用程序!) publicstringGreetingText getreturngreetingText; setgreetingText=value; CategoryAttribute(全局设置), DefaultValueAttribute(4) publicintItemsInMRUList getreturnitemsInMRU; setitemsInMRU=value; DescriptionAttribute(以毫秒表示的文本重复率。), CategoryAttribute(全局设置), DefaultValueAttribute(10) publicintMaxRepeatRate getreturnmaxRepeatRate; setmaxRepeatRate=value; BrowsableAttribute(false), DefaultValueAttribute(false) publicboolSettingsChanged getreturnsettingsChanged; setsettingsChanged=value; CategoryAttribute(版本), DefaultValueAttribute(1.0), ReadOnlyAttribute(true) publicstringAppVersion getreturnappVersion; setappVersion=value; 下面的屏幕快照显示了新属性在PropertyGrid中的外观。图 4:显示在 PropertyGrid 中的 .NET 框架数据类型请注意,WindowFont属性带有一个省略号 (.) 按钮,按下该按钮将显示字体选择对话框。此外,还可以展开该属性以显示更多的Font属性。某些Font属性提供有关字体的值和详细信息的下拉列表。您可以展开WindowSize属性以显示Size类型的更多属性。最后,请注意,ToolbarColor属性包含一个选定颜色的样本,以及一个用于选择不同颜色的自定义下拉列表。对于这些以及其他数据类型,.NET 框架提供了其他的类,可以使在PropertyGrid中的编辑更加容易。对自定义类型的支持现在,您需要在AppSettings类中添加另外两个属性,即DefaultFileName和SpellCheckOptions。DefaultFileName属性用于获取或设置字符串;SpellCheckOptions属性用于获取或设置SpellingOptions类的实例。SpellingOptions类是一个新类,用于管理应用程序的拼写检查属性。对于何时创建单独的类以管理对象的属性,并没有严格的规定,而取决于您的整个类设计。将SpellingOptions类定义添加到应用程序项目中 - 可以添加到新文件中,也可以添加到窗体源代码的下方。view plaincopy to clipboardprint? DescriptionAttribute(展开以查看应用程序的拼写选项。) publicclassSpellingOptions privateboolspellCheckWhileTyping=true; privateboolspellCheckCAPS=false; privateboolsuggestCorrections=true; DefaultValueAttribute(true) publicboolSpellCheckWhileTyping getreturnspellCheckWhileTyping; setspellCheckWhileTyping=value; DefaultValueAttribute(false) publicboolSpellCheckCAPS getreturnspellCheckCAPS; setspellCheckCAPS=value; DefaultValueAttribute(true) publicboolSuggestCorrections getreturnsuggestCorrections; setsuggestCorrections=value; 再次编译并运行选项窗口应用程序。下面的屏幕快照显示了应用程序的外观。图 5:在 PropertyGrid 中显示的不带类型转换器的自定义数据类型请注意SpellcheckOptions属性的外观。与 .NET 框架类型不同,它不展开或显示自定义的字符串表示。如果要在自己的复杂类型中提供与 .NET 框架类型相同的编辑体验,该如何处理呢?.NET 框架类型使用TypeConverter和UITypeEditor类提供大部分PropertyGrid编辑支持,您也可以使用这些类。添加可展开属性支持要使PropertyGrid能够展开SpellingOptions属性,您需要创建TypeConverter。TypeConverter提供了从一种类型转换为另一种类型的方法。PropertyGrid使用TypeConverter将对象类型转换为String,并使用该String在网格中显示对象值。在编辑过程中,TypeConverter会将String转换回对象类型。.NET 框架提供的ExpandableObjectConverter类可以简化这一过程。提供可展开对象支持 创建一个从ExpandableObjectConverter继承而来的类。view plaincopy to clipboardprint? publicclassSpellingOptionsConverter:ExpandableObjectConverter 如果destinationType参数与使用此类型转换器的类(示例中的SpellingOptions类)的类型相同,则覆盖CanConvertTo方法并返回true;否则返回基类CanConvertTo方法的值。view plaincopy to clipboardprint? publicoverrideboolCanConvertTo(ITypeDescriptorContextcontext, System.TypedestinationType) if(destinationType=typeof(SpellingOptions) returntrue; returnbase.CanConvertTo(context,destinationType); 覆盖ConvertTo方法,并确保destinationType参数是一个String,并且值的类型与使用此类型转换器的类(示例中的SpellingOptions类)相同。如果其中任一情况为false,都将返回基类ConvertTo方法的值;否则,返回值对象的字符串表示。字符串表示需要使用唯一分隔符将类的每个属性隔开。由于整个字符串都将显示在PropertyGrid中,因此需要选择一个不会影响可读性的分隔符,逗号的效果通常比较好。view plaincopy to clipboardprint? publicoverrideobjectConvertTo(ITypeDescriptorContextcontext,CultureInfoculture, objectvalue,System.TypedestinationType) if(destinationType=typeof(System.String)& valueisSpellingOptions) SpellingOptionsso=(SpellingOptions)value; return在键入时检查:+so.SpellCheckWhileTyping+ ,检查大小写:+so.SpellCheckCAPS+ ,建议更正:+so.SuggestCorrections; returnbase.ConvertTo(context,culture,value,destinationType); (可选)通过指定类型转换器可以从字符串进行转换,您可以启用网格中对象字符串表示的编辑。要执行此操作,首先需要覆盖CanConvertFrom方法并返回true(如果源Type参数为String类型);否则,返回基类CanConvertFrom方法的值。view plaincopy to clipboardprint? publicoverrideboolCanConvertFrom(ITypeDescriptorContextcontext,System.TypesourceType) if(sourceType=typeof(string) returntrue; returnbase.CanConvertFrom(context,sourceType); 要启用对象基类的编辑,同样需要覆盖ConvertFrom方法并确保值参数是一个String。如果不是String,将返回基类ConvertFrom方法的值;否则,返回基于值参数的类(示例中的SpellingOptions类)的新实例。您需要根据值参数解析类的每个属性的值。了解在ConvertTo方法中创建的分隔字符串的格式将有助于您的解析。view plaincopy to clipboardprint? publicoverrideobjectConvertFrom(ITypeDescriptorContextcontext,CultureInfoculture,objectvalue) if(valueisstring) try strings=(string)value; intcolon=s.IndexOf(:); intcomma=s.IndexOf(,); if(colon!=-1&comma!=-1) stringcheckWhileTyping=s.Substring(colon+1,(comma-colon-1); colon=s.IndexOf(:,comma+1); comma=s.IndexOf(,comma+1); stringcheckCaps=s.Substring(colon+1,(comma-colon-1); colon=s.IndexOf(:,comma+1); stringsuggCorr=s.Substring(colon+1); SpellingOptionsso=newSpellingOptions(); so.SpellCheckWhileTyping=Boolean.Parse(checkWhileTyping); so.SpellCheckCAPS=Boolean.Parse(checkCaps); so.SuggestCorrections=Boolean.Parse(suggCorr); returnso; catch thrownewArgumentException( 无法将“+(string)value+ ”转换为SpellingOptions类型); returnbase.ConvertFrom(context,culture,value); 现在已经有了一个类型转换器类,下面您需要确定使用该类的目标类。您可以通过将TypeConverterAttribute应用到目标类(示例中的SpellingOptions类)来执行此操作。view plaincopy to clipboardprint? /应用于SpellingOptions类的TypeConverter特性。 TypeConverterAttribute(typeof(SpellingOptionsConverter), DescriptionAttribute(“展开以查看应用程序的拼写选项。) publicclassSpellingOptions. 再次编译并运行选项窗口应用程序。下面的屏幕快照显示了选项窗口目前的外观。图 6:在 PropertyGrid 中显示的带有类型转换器的自定义数据类型注意:如果只需要可展开对象支持,而不需要自定义字符串表示,则只需将TypeConverterAttribute应用到类中。将ExpandableObjectConverter指定为类型转换器类型。添加域列表和简单的下拉列表属性支持对于基于Enum类型返回枚举的属性,PropertyGrid会自动在下拉列表中显示枚举值。EnumConverter也提供了这一功能。对于自己的属性,您可能希望为用户提供一个有效值列表(有时也称为选取列表或域列表),而其类型并不是基于Enum。如果域值在运行时之前未知,或者值可以更改,则属于这种情况。修改选项窗口,提供一个用户可从中选择的默认文件名的域列表。您已经将DefaultFileName属性添加到AppSettings类。下一步是在PropertyGrid中显示属性的下拉列表,以提供域列表。提供简单的下拉列表属性支持 创建一个从类型转换器类继承而来的类。由于DefaultFileName属性属于String类型,因此可以从StringConverter中继承。如果属性类型的类型转换器不存在,则可以从TypeConverter继承;这里并不需要。view plaincopy to clipboardprint? publicclassFileNameConverter:StringConverter 覆盖GetStandardValuesSupported方法并返回true,表示此对象支持可以从列表中选取的一组标准值。view plaincopy to clipboardprint? publicoverrideboolGetStandardValuesSupported(ITypeDescriptorContextcontext) returntrue; 覆盖GetStandardValues方法并返回填充了标准值的StandardValuesCollection。创建StandardValuesCollection的方法之一是在构造函数中提供一个值数组。对于选项窗口应用程序,您可以使用填充了建议的默认文件名的String数组。view plaincopy to clipboardprint? publicoverrideStandardValuesCollectionGetStandardValues(ITypeDescriptorContextcontext) returnnewStandardValuesCollection(newstring新文件,文件1,文档1); (可选)如果希望用户能够键入下拉列表中没有包含的值,请覆盖GetStandardValuesExclusive方法并返回false。这从根本上将下拉列表样式变成了组合框样式。view plaincopy to clipboardprin

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论