C# PropertyGrid控件应用心得

http://blog.csdn.net/luyifeiniu/article/details/5426960

最近项目中做一模块时偶发奇想,希望使用propertygrid的控件实现类似visual studio的属性样式,于是拿来一用,发现还真不是自己想象的那么简单,如果要实现一个比较好的展示,还真的需要不少技巧,通过自己的实践和网络的力量,“逢山开道,遇水搭桥”,总算是摸出一些门道,不敢私藏,拿出来与大家分享,呵呵。

 

先来转一个基础的,源自msdn

http://www.microsoft.com/taiwan/msdn/library/2002/Jul-2002/article/usingpropgrid.htm

摘要: 本文旨在帮助您了解 Microsoft .NET 框架中的 PropertyGrid 控件,以及如何针对您的应用程序自定义该控件。

适用于:
Microsoft® .NET® 框架
Microsoft® Visual Studio® .NET
目录

PropertyGrid 控件简介
创建 PropertyGrid 控件
何处使用 PropertyGrid 控件
选择对象
自定义 PropertyGrid 控件
显示复杂属性
为属性提供自定义 UI


PropertyGrid 控件简介

如果您使用过 Microsoft® Visual Basic® 或 Microsoft Visual Studio .NET,那么您一定使用过属性浏览器来浏览、查看和编辑一个或多个对象的属性。.NET 框架 PropertyGrid 控件是 Visual Studio .NET 属性浏览器的核心。PropertyGrid 控件显示对象或类型的属性,并主要通过使用反射来检索项目的属性。(反射是在运行时提供类型信息的技术。)

下面的屏幕快照显示了 PropertyGrid 在窗体上的外观。

窗体上的 PropertyGrid

图 1:窗体上的 PropertyGrid

PropertyGrid 包含以下部分:

  • 属性
  • 可展开属性
  • 属性类别标题
  • 属性说明
  • 属性编辑器
  • 属性选项卡
  • 命令窗格(显示控件设计器提供的设计器操作)

创建 PropertyGrid 控件

要使用 Visual Studio .NET 创建 PropertyGrid 控件,需要将该控件添加到工具箱中,因为默认情况下并不包含该控件。在 Tools (工具)菜单中,选择 Customize Toolbox (自定义工具箱)。在对话框中选择 Framework Components (框架组件)选项卡,然后选择 PropertyGrid

如果您从命令行编译代码,请使用 /reference 选项并指定 System.Windows.Forms.dll。

以下代码显示了如何创建 PropertyGrid 控件并将其添加到窗体中。

 

view plain copy to clipboard print ?
  1. using System;
  2. using System.Drawing;
  3. using System.ComponentModel;
  4. using System.Windows.Forms;
  5. using System.Globalization;
  6. public class OptionsDialog : System.Windows.Forms.Form
  7. {
  8. private System.Windows.Forms.PropertyGrid OptionsPropertyGrid;
  9. public OptionsDialog()
  10. {
  11. OptionsPropertyGrid = new PropertyGrid();
  12. OptionsPropertyGrid.Size = new Size(300, 250);
  13. this.Controls.Add(OptionsPropertyGrid);
  14. this.Text = "选项对话框";
  15. }
  16. [STAThread]
  17. static void Main()
  18. {
  19. Application.Run(new OptionsDialog());
  20. }
  21. }

using System; using System.Drawing; using System.ComponentModel; using System.Windows.Forms; using System.Globalization; public class OptionsDialog : System.Windows.Forms.Form { private System.Windows.Forms.PropertyGrid OptionsPropertyGrid; public OptionsDialog() { OptionsPropertyGrid = new PropertyGrid(); OptionsPropertyGrid.Size = new Size(300, 250); this.Controls.Add(OptionsPropertyGrid); this.Text = "选项对话框"; } [STAThread] static void Main() { Application.Run(new OptionsDialog()); } }
何处使用 PropertyGrid 控件
在应用程序中的很多地方,您都可以使用户与 PropertyGrid 进行交互,从而获得更丰富的编辑体验。例如,某个应用程序包含多个用户可以设置的“设置”或选项,其中一些可能十分复杂。您可以使用单选按钮、组合框或文本框来表示这些选项。但本文将逐步介绍如何使用 PropertyGrid 控件创建选项窗口来设置应用程序选项。上面所创建的 OptionsDialog 窗体即是选项窗口的开始。现在,我们创建一个名为 AppSettings 的类,其中包含映射到应用程序设置的所有属性。如果创建单独的类而不使用多个分散的变量,设置将更便于管理和维护。

 

 

view plain copy to clipboard print ?
  1. public class AppSettings{
  2. private bool saveOnClose = true;
  3. private string greetingText = "欢迎使用应用程序!";
  4. private int itemsInMRU = 4;
  5. private int maxRepeatRate = 10;
  6. private bool settingsChanged = false;
  7. private string appVersion = "1.0";
  8.  
  9. public bool SaveOnClose
  10. {
  11. get { return saveOnClose; }
  12. set { saveOnClose = value;}
  13. }
  14. public string GreetingText
  15. {
  16. get { return greetingText; }
  17. set { greetingText = value; }
  18. }
  19. public int MaxRepeatRate
  20. {
  21. get { return maxRepeatRate; }
  22. set { maxRepeatRate = value; }
  23. }
  24. public int ItemsInMRUList
  25. {
  26. get { return itemsInMRU; }
  27. set { itemsInMRU = value; }
  28. }
  29. public bool SettingsChanged
  30. {
  31. get { return settingsChanged; }
  32. set { settingsChanged = value; }
  33. }
  34. public string AppVersion
  35. {
  36. get { return appVersion; }
  37. set { appVersion = value; }
  38. }
  39. }

public class AppSettings{ private bool saveOnClose = true; private string greetingText = "欢迎使用应用程序!"; private int itemsInMRU = 4; private int maxRepeatRate = 10; private bool settingsChanged = false; private string appVersion = "1.0"; public bool SaveOnClose { get { return saveOnClose; } set { saveOnClose = value;} } public string GreetingText { get { return greetingText; } set { greetingText = value; } } public int MaxRepeatRate { get { return maxRepeatRate; } set { maxRepeatRate = value; } } public int ItemsInMRUList { get { return itemsInMRU; } set { itemsInMRU = value; } } public bool SettingsChanged { get { return settingsChanged; } set { settingsChanged = value; } } public string AppVersion { get { return appVersion; } set { appVersion = value; } } }

 

选项窗口上的 PropertyGrid 将使用此类,因此请将类定义添加到应用程序项目中,在添加时可创建新文件或将其添加到现有窗体源代码的下方。

选择对象

要标识 PropertyGrid 显示的内容,请将 PropertyGrid.SelectedObject 属性设置为一个对象实例。然后,PropertyGrid 将完成其余的工作。每次设置 SelectedObject 时,PropertyGrid 都会刷新显示的属性。这提供了一种简单的方法来强制刷新属性,或在运行时切换对象。您还可以调用 PropertyGrid.Refresh 方法来刷新属性。

接下来,您需要更新 OptionsDialog 构造函数中的代码,以创建一个 AppSettings 对象,并将其设置为 PropertyGrid.SelectedObject 属性的值。

 

view plain copy to clipboard print ?
  1. public OptionsDialog()
  2. {
  3. OptionsPropertyGrid = new PropertyGrid();
  4. OptionsPropertyGrid.Size = new Size(300, 250);
  5. this.Controls.Add(OptionsPropertyGrid);
  6. this.Text = "选项对话框";
  7. // 创建 AppSettings 类并在 PropertyGrid 中显示该类。
  8. AppSettings appset = new AppSettings();
  9. OptionsPropertyGrid.SelectedObject = appset;
  10. }

public OptionsDialog() { OptionsPropertyGrid = new PropertyGrid(); OptionsPropertyGrid.Size = new Size(300, 250); this.Controls.Add(OptionsPropertyGrid); this.Text = "选项对话框"; // 创建 AppSettings 类并在 PropertyGrid 中显示该类。 AppSettings appset = new AppSettings(); OptionsPropertyGrid.SelectedObject = appset; }

 

编译并运行该应用程序。下面的屏幕快照显示了应用程序的外观。

PropertyGrid 中选定的 AppSettings 类

图 2:PropertyGrid 中选定的 AppSettings 类

自定义 PropertyGrid 控件

您可以修改 PropertyGrid 的某些外观特征以满足自己的需要。可以更改某些属性的显示方式,甚至选择不显示某些属性。那么,如何对 PropertyGrid 进行自定义呢?

更改 PropertyGrid 的外观特征

PropertyGrid 的许多外观特征都可以自定义。下面列出了其中的一部分:

  • 通过 HelpBackColorHelpForeColorHelpVisible 属性可以更改背景颜色、更改字体颜色或隐藏说明窗格。
  • 通过 ToolbarVisible 属性可以隐藏工具栏,通过 BackColor 属性可以更改工具栏的颜色,通过 LargeButtons 属性可以显示大工具栏按钮。
  • 使用 PropertySort 属性可以按字母顺序对属性进行排序和分类。
  • 通过 BackColor 属性可以更改拆分器的颜色。
  • 通过 LineColor 属性可以更改网格线和边框。

本示例中的选项窗口不需要工具栏,因此可以将 ToolbarVisible 设置为 false 。其余属性均保留默认设置。

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

  • DescriptionAttribute - 设置显示在属性下方说明帮助窗格中的属性文本。这是一种为活动属性(即具有焦点的属性)提供帮助文本的有效方法。可以将此特性应用于 MaxRepeatRate 属性。
  • CategoryAttribute - 设置属性在网格中所属的类别。当您需要将属性按类别名称分组时,此特性非常有用。如果没有为属性指定类别,该属性将被分配给杂项 类别。可以将此特性应用于所有属性。
  • BrowsableAttribute – 表示是否在网格中显示属性。此特性可用于在网格中隐藏属性。默认情况下,公共属性始终显示在网格中。可以将此特性应用于 SettingsChanged 属性。
  • ReadOnlyAttribute – 表示属性是否为只读。此特性可用于禁止在网格中编辑属性。默认情况下,带有 get 和 set 访问函数的公共属性在网格中是可以编辑的。可以将此特性应用于 AppVersion 属性。
  • DefaultValueAttribute – 表示属性的默认值。如果希望为属性提供默认值,然后确定该属性值是否与默认值相同,则可使用此特性。可以将此特性应用于所有属性。
  • DefaultPropertyAttribute – 表示类的默认属性。在网格中选择某个类时,将首先突出显示该类的默认属性。可以将此特性应用于 AppSettings 类。

现在,我们将其中的一些特性应用于 AppSettings 类,以更改属性在 PropertyGrid 中的显示方式。

 

view plain copy to clipboard print ?
  1. [DefaultPropertyAttribute("SaveOnClose")]
  2. public class AppSettings{
  3. private bool saveOnClose = true;
  4. private string greetingText = "欢迎使用应用程序!";
  5. private int maxRepeatRate = 10;
  6. private int itemsInMRU = 4;
  7. private bool settingsChanged = false;
  8. private string appVersion = "1.0";
  9. [CategoryAttribute("文档设置"),
  10. DefaultValueAttribute(true)]
  11. public bool SaveOnClose
  12. {
  13. get { return saveOnClose; }
  14. set { saveOnClose = value;}
  15. }
  16. [CategoryAttribute("全局设置"),
  17. ReadOnlyAttribute(true),
  18. DefaultValueAttribute("欢迎使用应用程序!")]
  19. public string GreetingText
  20. {
  21. get { return greetingText; }
  22. set { greetingText = value; }
  23. }
  24. [CategoryAttribute("全局设置"),
  25. DefaultValueAttribute(4)]
  26. public int ItemsInMRUList
  27. {
  28. get { return itemsInMRU; }
  29. set { itemsInMRU = value; }
  30. }
  31. [DescriptionAttribute("以毫秒表示的文本重复率。"),
  32. CategoryAttribute("全局设置"),
  33. DefaultValueAttribute(10)]
  34. public int MaxRepeatRate
  35. {
  36. get { return maxRepeatRate; }
  37. set { maxRepeatRate = value; }
  38. }
  39. [BrowsableAttribute(false),
  40. DefaultValueAttribute(false)]
  41. public bool SettingsChanged
  42. {
  43. get { return settingsChanged; }
  44. set { settingsChanged = value; }
  45. }
  46. [CategoryAttribute("版本"),
  47. DefaultValueAttribute("1.0"),
  48. ReadOnlyAttribute(true)]
  49. public string AppVersion
  50. {
  51. get { return appVersion; }
  52. set { appVersion = value; }
  53. }
  54. }

[DefaultPropertyAttribute("SaveOnClose")] public class AppSettings{ private bool saveOnClose = true; private string greetingText = "欢迎使用应用程序!"; private int maxRepeatRate = 10; private int itemsInMRU = 4; private bool settingsChanged = false; private string appVersion = "1.0"; [CategoryAttribute("文档设置"), DefaultValueAttribute(true)] public bool SaveOnClose { get { return saveOnClose; } set { saveOnClose = value;} } [CategoryAttribute("全局设置"), ReadOnlyAttribute(true), DefaultValueAttribute("欢迎使用应用程序!")] public string GreetingText { get { return greetingText; } set { greetingText = value; } } [CategoryAttribute("全局设置"), DefaultValueAttribute(4)] public int ItemsInMRUList { get { return itemsInMRU; } set { itemsInMRU = value; } } [DescriptionAttribute("以毫秒表示的文本重复率。"), CategoryAttribute("全局设置"), DefaultValueAttribute(10)] public int MaxRepeatRate { get { return maxRepeatRate; } set { maxRepeatRate = value; } } [BrowsableAttribute(false), DefaultValueAttribute(false)] public bool SettingsChanged { get { return settingsChanged; } set { settingsChanged = value; } } [CategoryAttribute("版本"), DefaultValueAttribute("1.0"), ReadOnlyAttribute(true)] public string AppVersion { get { return appVersion; } set { appVersion = value; } } }

 

将这些特性应用于 AppSettings 类后,编译并运行该应用程序。下面的屏幕快照显示了应用程序的外观。

PropertyGrid 中显示的带有类别和默认值的属性

图 3:PropertyGrid 中显示的带有类别和默认值的属性

使用此版本的选项窗口后,您会注意到以下几点:

  • 显示窗口时,将首先突出显示 SaveOnClose 属性。
  • 选中 MaxRepeatRate 属性时,说明帮助窗格中将显示“以毫秒表示的文本重复率”。
  • SaveOnClose 属性显示在“文档设置”类别下。其他属性分别显示在“全局设置”和“版本”类别下。
  • SettingsChanged 属性将不再显示。
  • AppVersion 属性为只读。只读属性以灰显文本显示。
  • 如果 SaveOnClose 属性包含的值不是 true ,该值将以粗体显示。PropertyGrid 使用粗体文本表示包含非默认值的属性。

显示复杂属性

到现在为止,选项窗口显示的都是简单的类型,如整数、布尔值和字符串。那么,如何显示更复杂的类型呢?如果应用程序需要跟踪窗口大小、文档字体或工具栏颜色等信息,该如何处理呢?.NET 框架提供的某些数据类型具有特殊的显示功能,能使这些类型在 PropertyGrid 中更具可用性。
 

你可能感兴趣的:(职场,休闲,PropertyGrid)