WinForm窗体PropertyGrid控件的使用

  使用过 Microsoft Visual Basic 或 Microsoft Visual Studio .NET的朋友,一定使用过属性浏览器来浏览、查看或编辑一个或多个对象的属性。.NET 框架 PropertyGrid 控件是 Visual Studio .NET 属性浏览器的核心。PropertyGrid 控件显示对象或类型的属性,并主要通过使用反射(在运行时提供类型信息的技术)来检索项目的属性。PropertyGrid控件包含以下部分:一般属性、可展开属性、属性类别、属性说明和属性编辑器等。

  下面,我在我上一篇博客《Winform中DockPanel(引用WeifenLuo.WinFormsUI.Docking.dll组件)的使用》的基础上以代码的形式介绍PropertyGrid控件的使用。

  首先,定义一个PropertyGrid控件,并将其添加到DockPanelRight窗体

//为DockPanelLeft窗体添加PropertyGrid控件
propertyGrid = new PropertyGrid();
dockPanelSideRight.Controls.Add(propertyGrid);
InitPropertyGrid();

private void InitPropertyGrid()
{
    propertyGrid.Location = new Point(0, 0);
    //propertyGrid.Anchor = AnchorStyles.Left;
    propertyGrid.Dock = DockStyle.Fill;
}

  其次,添加一个属性类UserProperty,并自定义属性,属性类UserProperty代码如下:

class UserProperty
{
    private string _AppName;
    private string _AppPath;
    private Point _Location;// = new Point(0, 0);
    private Size _Size = new Size(0, 0);
    private Color _BackColor;
    private Color _ForeColor;
    private Font _Font;
    private String _Text;

    [CategoryAttribute("常规"), DescriptionAttribute("应用程序名称"), ReadOnlyAttribute(true)]
    public string AppName
    {
        get
        {
            return _AppName;
        }
        set
        {
            _AppName = value;
        }
    }
    [CategoryAttribute("常规"), DescriptionAttribute("应用程序路径"), ReadOnlyAttribute(true)]
    public string AppPath
    {
        get
        {
            return _AppPath;
        }
        set
        {
            _AppPath = value;
        }
    }

    [CategoryAttribute("布局"), DescriptionAttribute("位置"), ReadOnlyAttribute(false)]
    public Point Location
    {
        get
        {
            return _Location;
        }
        set
        {
            _Location = value;
        }
    }
    [CategoryAttribute("布局"), DescriptionAttribute("尺寸"), ReadOnlyAttribute(false)]
    public Size Size
    {
        get
        {
            return _Size;
        }
        set
        {
            _Size = value;
        }
    }

    [CategoryAttribute("外观"), DescriptionAttribute("背景色"), ReadOnlyAttribute(false)]
    public Color BackColor
    {
        get
        {
            return _BackColor;
        }
        set
        {
            _BackColor = value;
        }
    }
    [CategoryAttribute("外观"), DescriptionAttribute("前景色"), ReadOnlyAttribute(false)]
    public Color ForeColor
    {
        get
        {
            return _ForeColor;
        }
        set
        {
            _ForeColor = value;
        }
    }
    [CategoryAttribute("外观"), DescriptionAttribute("文本")]
    public String Text
    {
        get
        {
            return _Text;
        }
        set
        {
            _Text = value;
        }
    }
    [CategoryAttribute("外观"), DescriptionAttribute("字体")]
    public Font Font
    {
        get
        {
            return _Font;
        }
        set
        {
            _Font = value;
        }
    }
}

  最后,实例化UserProperty类,并将其设定为propertyGrid的SelectedObject属性

//设置PropertyGrid控件的值,自定义属性
propertyUser = new UserProperty();
propertyGrid.SelectedObject = propertyUser;
InitPropertyUser();  

private void InitPropertyUser()
{
    propertyUser.AppName = this.Text;
    propertyUser.Size = this.ClientSize;
    propertyUser.Location = this.Location;
}

  运行效果如下所示:

  

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

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