通过反射更改PropertyGrid的只读以及可见特性

在开发Winform程序中,PropertyGrid是一个常用的控件,在使用PropertyGrid的过程中,只需要将对应的对象实例赋给PropertyGrid的SelectedObject属性即可。当然,需要在对应的对象定义中添加相应的属性。

 1 class Human
 2     {
 3         private int _age;
 4         private string _name;
 5         private Gender _gender;
 6
 7         [DisplayName("姓名"),
 8         Browsable(true)]
 9         public string Name
10         {
11             get { return _name; }
12             set { _name = value; }
13         }
14         [DisplayName("年龄"),
15         Browsable(true)]
16         public int Age
17         {
18             get { return _age; }
19             set { _age = value; }
20         }
21
22         [DisplayName("性别"),
23         Browsable(true),
24         ReadOnly(true)]
25         public Gender Gender
26         {
27             get { return _gender; }
28             set { _gender = value; }
29         }
30
31     }
32
33     enum Gender
34     {
35         Man,
36         Woman
37     }

Human.cs

可以看到,用户可以自定义属性在PropertyGrid中的显示,包括显示名称等等。注意代码中的ReadOnly特性以及Browsable特性,这两个特性的值在编译完成之后无法在更改。

但是我们可能有这样的需求,在程序运行过程中动态的更改ReadOnly特性以及Browsable特性。此时可以通过反射来实现,先上代码

 1  public partial class Form1 : Form
 2     {
 3         Human _human = null;
 4         public Form1()
 5         {
 6             InitializeComponent();
 7             _human = new Human { Name = "Jashon Han", Gender = Gender.Man, Age = 26 };
 8             Load += Form1_Load;
 9
10         }
11
12         void Form1_Load(object sender, EventArgs e)
13         {
14             this.propertyGrid1.SelectedObject = _human;
15         }
16
17         private void buttonReadOnly_Click(object sender, EventArgs e)
18         {
19            SetPropertyReadOnly(_human,"Gender",true);
20            this.propertyGrid1.SelectedObject = _human;
21         }
22
23         private void buttonHide_Click(object sender, EventArgs e)
24         {
25             SetPropertyVisibility(_human,"Age",false);
26             this.propertyGrid1.SelectedObject = _human;
27         }
28
29         private void SetPropertyVisibility(object obj, string propertyName, bool visible)
30         {
31             try
32             {
33                 Type type = typeof(BrowsableAttribute);
34                 PropertyDescriptorCollection props = TypeDescriptor.GetProperties(obj);
35                 AttributeCollection attrs = props[propertyName].Attributes;
36                 FieldInfo fld = type.GetField("browsable", BindingFlags.Instance | BindingFlags.NonPublic);
37                 fld.SetValue(attrs[type], visible);
38             }
39             catch (Exception ex)
40             {
41                 MessageBox.Show(ex.ToString());
42             }
43         }
44
45         private void SetPropertyReadOnly(object obj, string propertyName, bool isReadOnly)
46         {
47             try
48             {
49                 Type type = typeof(ReadOnlyAttribute);
50                 PropertyDescriptorCollection props = TypeDescriptor.GetProperties(obj);
51                 AttributeCollection attrs = props[propertyName].Attributes;
52                 FieldInfo fld = type.GetField("isReadOnly", BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.CreateInstance);
53                 fld.SetValue(attrs[type], isReadOnly);
54             }
55             catch (Exception ex)
56             {
57                 MessageBox.Show(ex.ToString());
58             }
59
60         }

Form1.cs

运行效果如下:

点击"性别为只读"按钮:

点击“隐藏年龄”按钮 :

时间: 2024-08-25 07:47:17

通过反射更改PropertyGrid的只读以及可见特性的相关文章

重踏学习Java路上_Day27(反射,模式设计,jdk新特性)

1:反射(理解) (1)类的加载及类加载器 (2)反射: 通过字节码文件对象,去使用成员变量,构造方法,成员方法 (3)反射的使用 A:通过反射获取构造方法并使用 B:通过反射获取成员变量并使用 C:通过反射获取成员方法并使用 (4)反射案例 A:通过反射运行配置文件的内容 B:通过反射越过泛型检查 C:通过反射给任意的一个对象的任意的属性赋值为指定的值 (5)动态代理 2:设计模式 (1)装饰设计模式 BufferedReader br = new BufferedReader(new Inp

利用反射来实现获取成员的指定特性(Attribute)信息

在开发过程中,我们经常需要自定义一些特性,来辅助我们完成对对象或者枚举进行管理.我们需要知道如何获取对象使用的特性信息. 以下举个学习用的例子. 我们自定义一个特性类,这个特性设置在一个数据段内是否执行使用这个特性的方法,特性如下 [AttributeUsage(AttributeTargets.Method, Inherited = false, AllowMultiple = false)] public class ExcuceAttribute : Attribute { public

反射 学习笔记(四)自定义特性

目标:掌握如何自定义特性,如何使用自定义的特性 一个特性直到另一个软件反射它的值时才有用.给定特性被发送后,软件可以采取任何需要的行为. 第一步:自定义特性类 第二步:使用自定义特性 第三步:通过早期绑定获取特性值 记得将程序集导入 所为的早期绑定就是直接创建对象 第四步:使用晚期绑定获取特性值 第五步:打印出来

C#利用反射检查对象属性是否满足正则特性

有时对象的属性需要满足某些正则,若是单独创建方法去一个个验证这些正则太过麻烦,这时我们可以给属性添加正则特性,如下: public class student { [RegularExpression(@"^[a-zA-Z]{1,20}$", ErrorMessage = "英文姓名必须是英文字符,且长度小于20!")] public string EName { get; set; } } 可是有时候对象实例的生成会绕过这些正则检查,例如直接从Excel里数据流写

System.Windows.Forms.PropertyGrid的使用

PropertyGrid 控件简介 .NET 框架 PropertyGrid 控件是 Visual Studio .NET 属性浏览器的核心.PropertyGrid 控件显示对象或类型的属性,并主要通过使用反射来检索项目的属性.当我们创建了一个类编译之后就生成了类的Metadata,元数据.PropertyGrid 就是使用反射来展示和修改类的公共属性的,就是public标识的属性.但凡成熟的软件都是使用配置来满足不同场景或者客户的需求,就是使用参数开关的形式.PropertyGrid 代表了

NET 框架 PropertyGrid 控件

NET框架PropertyGrid控件是 Visual Studio .NET 属性浏览器的核心.PropertyGrid控件显示对象或类型的属性,并主要通过使用反射来检索项目的属性 首先创建 PropertyGrid 控件要使用 Visual Studio .NET 创建 PropertyGrid 控件,需要将该控件添加到工具箱中,因为默认情况下并不包含该控件.在 Tools(工具)菜单中,选择 Customize Toolbox(自定义工具箱).在对话框中选择 Framework Compo

WinForm窗体PropertyGrid控件的使用

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

C# PropertyGrid控件应用心得

何处使用 PropertyGrid 控件 在应用程序中的很多地方,您都可以使用户与 PropertyGrid 进行交互,从而获得更丰富的编辑体验.例如,某个应用程序包含多个用户可以设置的“设置”或选项,其中一些可能十分复杂.您可以使用单选按钮.组合框或文本框来表示这些选项.但本文将逐步介绍如何使用 PropertyGrid 控件创建选项窗口来设置应用程序选项.上面所创建的 OptionsDialog 窗体即是选项窗口的开始.现在,我们创建一个名为 AppSettings 的类,其中包含映射到应用

C# 设计时动态改变实体在PropertyGrid中显示出来的属性

方法一: /// <summary> /// 实体属性处理 /// </summary> public class PropertyHandle { #region 反射控制只读.可见属性 //SetPropertyVisibility(obj, "名称 ", true); //obj指的就是你的SelectObject, "名称"是你SelectObject的一个属性 //当然,调用这两个方法后,重新SelectObject一下,就可以了.