PropertyGrid控件由浅入深(二):基础用法

时间:2021-09-12 15:55:05

目录

  1. PropertyGrid控件由浅入深(一):文章大纲
  2. PropertyGrid控件由浅入深(二):基础用法

控件的外观构成

控件的外观构成如下图所示:

PropertyGrid控件由浅入深(二):基础用法

PropertyGrid控件包含以下几个要素:

  • 属性名称

    属性的名称、标题。
  • 属性编辑器(属性值)

    这里显示的是属性的当前值,显示的一般为文字,也可以以图标的形式。编辑器会自动根据数据的类型定义一个验证器,比如属性类型为int类型,你是无法输入字符内容的。另外,一般属性的编辑是直接在属性值这栏直接输入,但是复杂的属性,一般都会提供一个自定义的属性编辑器以便更友好的输入,比如颜色选择。
  • 属性说明(描述)

    属性的详细描述。
  • 可展开属性

    对象属性的展示,以便都是显示对象属性的名称,以及对象属性的值的.ToString()方法。除非,你设置这个属性的特性Attribute为可展开属性TypeConverter(typeof(ExpandableObjectConverter))。具体用法查看下一篇的“高级用法
  • 属性分组

    属性较多时,通过分组的形式,可以很容易的对属性进行良好的组织。最常用的,就是我们在扩展一个控件的属性时,可以给自定义出来的属性打上一个分组标签“xx公司自定义属性”,这样,别人在用你这个自定义控件的属性时,就非常容易查看到哪些属性是扩展上去的了。
  • 属性的排序方式:按字母顺序还是按分组排序

    可以选择按字面顺序排序、还是按分组排序来显示所有的属性,方便查找。在实际运用中,一般都是按分组显示的。如果你对控件应用很熟悉了,已经知道有哪些属性了,按字母排序,会加快你查找的速度。

控件的基本属性

PropertyGrid控件继承控件基类:Contorl,因此会包含Contorl的所有属性,这里就不详细的一一介绍了。

我们主要看看PropertyGrid特有的几个属性:

  • SelectedObject

    当前所绑定的对象
  • HelpVisible

    属性描述区域是否显示
  • HelpBackColor

    属性描述区域的背景颜色
  • HelpForeColor

    属性描述区域的前景颜色
  • CategoryForeColor

    属性分组标题的前景颜色
  • ToolbarVisible

    工具栏是否可见
  • LargeButtons

    属性可以显示大工具栏按钮

控件的基本事件

同样,我们只关心其中最常用的事件:PropertyValueChanged。即当属性变化时触发的事件。

这个事件包括两个参数:

  • object sender

    这里就是PropertyGrid控件

  • PropertyValueChangedEventArgs e

    我们查看下VS调试状态这个值的属性

    PropertyGrid控件由浅入深(二):基础用法

    其中包含了两个重要的属性:OldValueChangeItem。而ChangeItem则是“PropertyDescriptorGridEntry”类型。

    一般可以通过ChangeItem的PropertyDescriptor的ComponentType查找到属性的实际类型。

    而通过ChangeItem的Label,则可以查看到当前在属性编辑输入框中显示的值。

    通过ChangeItem,基本可以处理所有的属性变化的处理。

控件的对象绑定

控件的对象绑定非常非常简单,只需一句话即可:propertyGrid1.SelectedObject = stu;

每次设置 SelectedObject 时,PropertyGrid 都会刷新显示的属性。这提供了一种简单的方法来强制刷新属性,或在运行时切换对象。您还可以调用 PropertyGrid.Refresh 方法来刷新属性。

这里还有另外一个有意思的属性:propertyGrid1.SelectedObjects = new object[] { stu, emp };。一般人可能不太理解这个的意思,而且在使用了这个绑定之后,有时竟然一个属性都不出现了!

其实:propertyGrid1.SelectedObjects是用来显示多个对象公用属性的,参考MSDN的文档:

The PropertyGrid only displays the properties that are common to all the objects that are in the array. Assigning an array to the SelectedObjects replaces the reference to any SelectedObject you might make.

比如我有如下两个对象:

public class Employee
{
public string Company { get; set; }
public string Name { get; set; }
}
public class Student
{
public string Name { get; set; }
public SchoolType SchoolType { get; set; }
}

那么绑定这两个对象到PropertyGrid控件会发生什么呢?

        var stu = new Student { Name = "Oracle", SchoolType = SchoolType.MiddleSchool };
var emp = new Employee { Name = "Marvin", Company = "IBM" }; propertyGrid1.SelectedObjects = new object[] { stu, emp };

我们看看最终的结果:

PropertyGrid控件由浅入深(二):基础用法

如何更改属性的展示

在使用propertyGrid1.SelectedObject = stu;绑定属性到对象之后,我们发现,属性的名称总是英文的名称,描述也是不按我们的意思来,那么怎么修改呢?

PropertyGrid采用Attribute特性来控制属性的显示,除了属性名称、描述之后,还能控制属性是否只读、属性是否显示等等。具体可用的特性枚举如下:

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

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

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

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

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

    注意,此属性仅用于序列化以及控件本身使用,并不实际对属性进行默认值赋值。也就是,即使你设置了DefaultValue,在实际运行中,如果你没有在构造函数或者其他任何地方赋值,则系统不会对该属性赋值。如果你希望真正的给个默认值,则需要在构造函数中进行默认值的赋值。

    参考*

    [DefaultValue] is only used by (for example) serialization APIs (like XmlSerializer), and some UI elements (like PropertyGrid). It doesn't set the value itself; you must use a constructor for that:
  • DefaultPropertyAttribute – 表示类的默认属性。在网格中选择某个类时,将首先突出显示该类的默认属性。

参考示例:

public class Student
{
[Browsable(false)]
public int Id { get; set; } [DisplayName("学生名称"), Category("基础设置"), Description("请填写学生的名称,不能为空"), ReadOnly(true)]
public string Name { get; set; } [DefaultValue(SchoolType.University)]
public SchoolType SchoolType { get; set; }
}

PropertyGrid控件由浅入深(二):基础用法

参考文章:

  1. .Net DefaultValueAttribute on Properties
  2. DefaultValue not working as expected when used with Custom Type Convertor
  3. C# PropertyGrid控件应用心得

PropertyGrid控件由浅入深(二):基础用法的更多相关文章

  1. PropertyGrid控件由浅入深(一):文章大纲

    Winform中PropertyGrid控件是一个非常好用的对象属性编辑工具,对于Key-Value形式的数据的处理也是非常的好用. 因为Property控件设计良好,在很小的空间内可以展示很多的内容 ...

  2. C# 如何定义让PropertyGrid控件显示[...]按钮,并且点击后以下拉框形式显示自定义控件编辑属性值

    关于PropertyGrid控件的详细用法请参考文献: 1.C# PropertyGrid控件应用心得 2.C#自定义PropertyGrid属性 首先定义一个要在下拉框显示的控件: using Sy ...

  3. C# PropertyGrid控件应用心得 【转】

    源文 : http://blog.csdn.net/luyifeiniu/article/details/5426960 c#stringattributesobjectmicrosoftclass ...

  4. WinForm小白的WPF初试一:从PropertyGrid控件,输出内容到Word(上)

    学WinForm也就半年,然后转到WPF,还在熟悉中.最近拿到一个任务:从PropertyGrid控件,输出内容到Word.难点有: 一.PropertyGrid控件是WinForm控件,在WPF中并 ...

  5. WinForm窗体PropertyGrid控件的使用

    使用过 Microsoft Visual Basic 或 Microsoft Visual Studio .NET的朋友,一定使用过属性浏览器来浏览.查看或编辑一个或多个对象的属性..NET 框架 P ...

  6. C# PropertyGrid控件应用心得

    何处使用 PropertyGrid 控件 在应用程序中的很多地方,您都可以使用户与 PropertyGrid 进行交互,从而获得更丰富的编辑体验.例如,某个应用程序包含多个用户可以设置的“设置”或选项 ...

  7. 重新想象 Windows 8 Store Apps (9) - 控件之 ScrollViewer 基础

    原文:重新想象 Windows 8 Store Apps (9) - 控件之 ScrollViewer 基础 [源码下载] 重新想象 Windows 8 Store Apps (9) - 控件之 Sc ...

  8. 背水一战 Windows 10 (46) - 控件(ScrollViewer 基础): ScrollViewer, ScrollBar, ScrollContentPresenter

    [源码下载] 背水一战 Windows 10 (46) - 控件(ScrollViewer 基础): ScrollViewer, ScrollBar, ScrollContentPresenter 作 ...

  9. Android控件RecyclerView的基本用法

    Android控件RecyclerView的基本用法 转 https://www.jianshu.com/p/e71a4b73098f   github: https://github.com/Cym ...

随机推荐

  1. C# Winform学习--- 实现石头剪刀布的游戏

    本文使用winform实现简单的石头剪刀布的游戏,主要实现,电脑随机出拳,玩家手动点击出拳:实现简易背景图片3秒切换:简易统计信息. 1.效果图 2.实现代码 新建一个windows窗体程序,用数字1 ...

  2. 字节流和字符流(InputStream类和OutputStream类)

    java流包括字节流和字符流,字节流通过I/O设备以字节数据的方式读入,而字符流则是通过字节流读入数据转换成字符"流"的形式由用户驱使. InputStream是所有字节输入流的父 ...

  3. C#函数式程序设计之用闭包封装数据

    如果一个程序设计语言能够用高阶函数解决问题,则意味着数据作用域问题已十分突出.当函数可以当成参数和返回值在函数之间进行传递时,编译器利用闭包扩展变量的作用域,以保证随时能得到所需要的数据. C#函数式 ...

  4. 从实用主义深入理解c++虚函数

    记得几个月前看过C++虚函数的问题,当时其实就看懂了,最近笔试中遇到了虚函数竟然不太确定,所以还是理解的不深刻,所以想通过这篇文章来巩固下. 装逼一刻: 最近,本人思想发生了巨大的转变,在大学的时候由 ...

  5. LightOJ 1247	Matrix Game (尼姆博弈)

    A - Matrix Game Time Limit:2000MS     Memory Limit:32768KB     64bit IO Format:%lld & %llu Submi ...

  6. Js获取标签高度

    能力有限:问个问题,标签相对页面高度,是怎么写? 鼠标的横坐标,X轴: event.clientX; 鼠标的竖坐标,Y轴: event.clientY; 网页可见区域宽:    document.bo ...

  7. Composer PHP 依赖管理工具

    composer 是 PHP 用来管理依赖(dependency)关系的工具.你可以在自己的项目中声明所依赖的外部工具库(libraries),Composer 会帮你安装这些依赖的库文件. 依赖管理 ...

  8. UVa10047 The Monocycle

    UVa10047 The Monocycle 链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=19491 (以上摘自htt ...

  9. .net(全局文件,错误页,静态页,IIS配置及防黑)

    添加全局应用程序类. <%@ Application Language="C#" %> <script runat="server"> ...

  10. ELK学习笔记(四)SpringBoot&plus;Logback&plus;Redis&plus;ELK实例

    废话不多说,直接上干货,首先看下整体应用的大致结构.(整个过程我用到了两台虚拟机  应用和Shipper 部署在192.168.25.128 上 Redis和ELK 部署在192.168.25.129 ...