PropertyGrid--基本功能
一.引言
PropertyGrid是Visual Studio中新增的控件,顾名思义,其主要是用来显示和设置某一(或多个)对象的属性值的。其具体的实现主要是基于.Net中强大的反射机制。PropertyGrid功能十分的强大,本人能力有限,集MSDN及丰富的网络资源,略窥一斑,虽晓之甚少,亦不敢掩藏,呈之于文,抛砖引玉。
二.PropertyGrid基本功能
1. PropertyGrid简介
使用PropertyGrid非常简单,这得感谢微软的技术大牛们,控件已经封装的非常完美,拿来就用,以下是MSDN中对PropertyGrid的介绍:
(1)要使用PropertyGrid,应在父控件上创建 PropertyGrid 类的新实例,并将 SelectedObject设置成要为其显示属性的对象。
(2)网格中显示的信息是分配对象时的属性快照。 如果在运行时从代码中更改了由 SelectedObject 指定的对象的属性值,则一直要到在网格中执行了某个操作而使网格刷新时,才会显示新值。
(3)PropertyGrid中的属性选项卡作为按钮显示在 PropertyGrid 顶部的工具栏上,并且可以在 PropertyTabScope 中定义的范围内变化。可以使用 LargeButtons 属性公开用按钮而不是该默认值较小。 大按钮为 32 x 32 像素,而不是标准的 16 x 16 像素。 大小按钮和属性列出 expander 图标 (加号图标) 基于一组系统的 DPI 调整大小,当 app.config 文件包含以下项时:
<appSettings>
<add key="EnableWindowsFormsHighDpiAutoResizing" value="true" />
</appSettings>
(4)PropertyGrid 控件最初并不在开发环境的工具箱中提供。 可以将属性网格添加到工具箱中,以便将 PropertyGrid 拖到窗体中。 您还可以通过在源代码中添加相应的代码来定义 PropertyGrid 的实例。
(5)默认情况下,SelectedObject 的所有公共属性将会在 PropertyGrid 中显示。 您可以通过使用 BrowsableAttribute 修饰某属性并将其值设置为 false 来隐藏该属性,以使其不在 PropertyGrid 控件中显示。 您可以提供具有 CategoryAttribute 的一个类别来指定在其中显示属性的类别。 您可以使用 DescriptionAttribute 为在 PropertyGrid 控件底部显示的属性提供说明性文字。
这几段文字基本说明了PropertyGrid的用法,很简单,只要new 一个PropertyGrid对象(或者直接从工具箱中拖),设置其几个属性(大小,位置),需要显示某个对象的属性时,只需将该对象赋给PropertyGrid的SelectedObject属性即可。
如果对象的属性通过其他的方式(不是通过PropertyGrid)改变了,只需要调用PropertyGrid的Refresh方法,即可更新。
PropertyGrid中的属性选项卡作为按钮显示在 PropertyGrid 顶部的工具栏上,通过LargeButtons 属性可以设置按钮使用大图标或小图标。
小图标效果:

大图标效果:
    
2.使用方法
下面举个具体的例子进行说明:
假如现在我们要自定义一个控件,我们希望我们的控件的属性能显示在属性框中。
①新建Windows工程,在Form对话框中拖入一个PropertyGrid控件。
②添加我们的控件类,当然这个控件没什么用,只是用来举例说明:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms; namespace TestPropertyGrid
{
public class SimpleControl : System.Windows.Forms.Control
{
private int _prop; public int Prop
{
get { return _prop; }
set { this._prop = value; }
} public SimpleControl()
{ }
}
}
③在Form1中添加我们的控件,并将其赋给propertyGrid1.SelectedObject属性:
public partial class Form1 : Form
{
SimpleControl _simpleControl;//自定义控件 public Form1()
{
InitializeComponent(); //通过PropertyGrid控件显示自定义控件属性
_simpleControl = new SimpleControl();
this.propertyGrid1.SelectedObject = _simpleControl;
}
}
④运行程序,在属性框的最下面,可以找到一个杂项的节点,显示我们自定义控件中的属性。
    
属性显示在杂项中,不好看,且功能不明确,这里需要设置属性的特性(Atrribute)来控制他在属性框中的展现。这里需要使用上面所说到的BrowsableAttribute, CategoryAttribute,DescriptionAttribute三个特性。使用这些特性的时候,注意要引入命名空间 System.ComponentModel。
BrowsableAttribute:所修饰的属性是否在 PropertyGrid 控件中显示。
CategoryAttribute:所修饰的属性在PropertyGrid 控件中分类(即杂项)
DescriptionAttribute:在 PropertyGrid 控件底部显示的说明性文字
在我们自定义控件中的属性加上这些特性:
        [Browsable(true), Category("布局"),Description("just a test")]
         public int Prop
         {
             get { return _prop; }
             set { this._prop = value; }
         }
运行效果如下,属性出现在布局类别中,选中该项,下面会出现Description特性中描述的文字。
    
3.对象集合的属性显示
接下来我们再定义一个自定义控件SimpleControl2,该控件和SimpleControl一样有个Prop属性,但多一个Prop2属性:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ComponentModel; namespace TestPropertyGrid
{
public class SimpleControl2 : System.Windows.Forms.Control
{
private int _prop;
private int _prop2; [Browsable(true), Category("布局"), Description("just a test")]
public int Prop
{
get { return _prop; }
set { this._prop = value; }
} [Browsable(true), Category("布局"), Description("just a test")]
public int Prop2
{
get { return _prop2; }
set { this._prop2 = value; }
} public SimpleControl2()
{
_prop = ;
}
}
在Form1中添加一个SimpleControl2控件和Control集合:
public partial class Form1 : Form
{
SimpleControl _simpleControl; //控件1
SimpleControl2 _simpleControl2; //控件2
Control[] _controls; //集合 public Form1()
{
InitializeComponent(); _simpleControl = new SimpleControl();
_simpleControl2 = new SimpleControl2();
_controls = new Control[] { _simpleControl, _simpleControl2 }; this.propertyGrid1.SelectedObject = _controls;
}
}
当我们将_controls集合赋给SelectedObject时,效果如下:
    
PropertyGrid将集合中的元素分别列举出来([0],[1]),而且属性的分类排序和字母排序好像失效,但是属性是全部显示的。
下面将this.propertyGrid1.SelectedObject = _controls;替换为this.propertyGrid1.SelectedObjects = _controls;效果如下:
    
PropertyGrid只会显示集合中元素所共有的属性,(如上例中有Prop而没有Prop2),且如果共有属性的值不同,值是不会显示的,(如Prop的初始值不同,故其值不显示),但设置的时候,会将所有元素的属性设置为同一值。
PropertyGrid--基本功能的更多相关文章
- 获取extjs text列修改过 数据
		
ExtJS中表格的特性简介 表格由类Ext.grid.GridPanel定义,继承自Ext.Panel,xtype为grid 表格的列信息由Ext.grid.ColumnModel定义 表格的数据存储 ...
 - PropertyGrid控件由浅入深(一):文章大纲
		
Winform中PropertyGrid控件是一个非常好用的对象属性编辑工具,对于Key-Value形式的数据的处理也是非常的好用. 因为Property控件设计良好,在很小的空间内可以展示很多的内容 ...
 - easyui propertygrid 动态绑定
		
从$.fn.datagrid.defaults继承,覆盖默认值 $.fn.propertygrid.defaults propertygrid 提供用户一个接口,浏览和编辑对象属性,propertyg ...
 - 一款开源且功能强大的C#甘特图控件.NET Winforms Gantt Chart Control
		
甘特图在项目管理中非常重要,甘特图的思想比较简单,即以图示的方式通过活动列表和时间刻度形象地表示出任何特定项目的活动顺序与持续时间.它直观地表明任务计划在什么时候进行,及实际进展与计划要求的对比.管理 ...
 - C# PropertyGrid控件应用心得
		
何处使用 PropertyGrid 控件 在应用程序中的很多地方,您都可以使用户与 PropertyGrid 进行交互,从而获得更丰富的编辑体验.例如,某个应用程序包含多个用户可以设置的“设置”或选项 ...
 - ExtJS4.2学习(九)属性表格控件PropertyGrid(转)
		
鸣谢网址:http://www.shuyangyang.com.cn/jishuliangongfang/qianduanjishu/2013-11-15/178.html ------------- ...
 - PropertyGrid—添加属性Tab
		
零.引言 PropertyGrid用来显示和编辑对象的属性,前面已经简单介绍了如何使用该控件和提供不同的属性编辑方法.前面主要讲如何使用该控件,但有时,该控件无法满足我们的需求,就需要对其进行扩展.本 ...
 - PropertyGrid—添加EventTab
		
零.引言 前面一篇文章介绍了如何在PropertyGrid中添加属性Tab,本文主要介绍如何添加事件选项卡.事件在许多对象中都有,尤其是在控件中,如何让对象的事件在PropertyGrid中显示出来呢 ...
 - PropertyGrid自定义控件
		
PropertyGrid是一个很强大的控件,使用该控件做属性设置面板的一个好处就是你只需要专注于代码而无需关注UI的呈现,PropertyGrid会默认根据变量类型选择合适的控件显示.但是这也带来了一 ...
 
随机推荐
- easy ui 如何单个引用其中某个插件?
			
记录一下这个方法,前端时间一直在纠结这个问题,后来听一些前辈讲解后才恍然大悟,要单独引用某个插件,我们需要重视的是:easyloaer.js ,easy ui的下载包中也有easyloader的dem ...
 - nginx错误日志级别
			
在配置nginx.conf 的时候,有一项是指定错误日志的,默认情况下你不指定也没有关系,因为nginx很少有错误日志记录的.但有时出现问题时,是有必要记录一下错误日志的,方便我们排查问题.error ...
 - Java单例模式的线程安全问题
			
单例模式有两种书写模式:饿汉式和懒汉式. 1.饿汉式 class Single{ private final static Single s = new Single(); private Singl ...
 - java 时间格式化(2016.04.12 12:32:55)
			
输入的时间格式如:2016.04.12 12:32:55所示: 想要获取一定格式的日期,时间的方法 String startString = "2016.04.25 12:25:44&quo ...
 - 求1+2+3+...+n的值,要求不能使用乘除法,for、while、if、else、switch、case、等关键字及条件判断语句(JAVA)
			
采用递归和三目表达式注意红色字体一定不能写成n-- 1 package com.hunag; public class Sum { static int sum; public static int ...
 - tablbView中section的间距
			
- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section { if (sect ...
 - stack 集合栈计算机 (摘)
			
有一个专门为了集合运算而设计的“集合栈”计算机.该机器有一个初始为空的栈,并且支持以下操作:PUSH:空集“{}”入栈DUP:把当前栈顶元素复制一份后再入栈UNION:出栈两个集合,然后把两者的并集入 ...
 - linux学习笔记之套接字
			
一.基础知识. 1:套接字基础. 1,是通信端点的抽象. 2,在UNIX类系统中被当作是一种文件描述符. 3,套接字通信域. 域 描述 AF_INET IPV4因特网域 AF_INET6 IPV6因特 ...
 - Fragment与Activity
			
一个Fragment的实例总是和包含它的Activity直接相关. fragment可以通过getActivity() 方法来获得Activity的实例,然后就可以调用一些例如findViewById ...
 - 初学swift笔记 结构体(八)
			
import Foundation /* 和类很相似 结构体 -> 封装 属性.方法 结构体是值类型 */ //定义一个LSQ类型的结构体 关键字struct struct LSQ { var ...