C# 设计时动态改变实体在PropertyGrid中显示出来的属性
方法一:
/// <summary>/// 实体属性处理/// </summary>public class PropertyHandle{#region 反射控制只读、可见属性//SetPropertyVisibility(obj, "名称 ", true); //obj指的就是你的SelectObject, “名称”是你SelectObject的一个属性 //当然,调用这两个方法后,重新SelectObject一下,就可以了。/// <summary>/// 通过反射控制属性是否只读/// </summary>/// <param name="obj"></param>/// <param name="propertyName"></param>/// <param name="readOnly"></param>public static void SetPropertyReadOnly(object obj, string propertyName, bool readOnly){Type type = typeof(ReadOnlyAttribute);PropertyDescriptorCollection props = TypeDescriptor.GetProperties(obj);AttributeCollection attrs = props[propertyName].Attributes;FieldInfo fld = type.GetField("isReadOnly", BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.CreateInstance);fld.SetValue(attrs[type], readOnly);}/// <summary>/// 通过反射控制属性是否可见/// </summary>/// <param name="obj"></param>/// <param name="propertyName"></param>/// <param name="visible"></param>public static void SetPropertyVisibility(object obj, string propertyName, bool visible){Type type = typeof(BrowsableAttribute);PropertyDescriptorCollection props = TypeDescriptor.GetProperties(obj);AttributeCollection attrs = props[propertyName].Attributes;FieldInfo fld = type.GetField("browsable", BindingFlags.Instance | BindingFlags.NonPublic);fld.SetValue(attrs[type], visible);}#endregion}
举例:比如某个实体类TestEntity中有自增列(IdentityColumnInfo)这么一个属性,该自增列对应的实体类如下:
public class IdentityColumnEntity {private bool isIncrementColumn;/// <summary>/// 是否是自增列/// </summary>[Browsable(true)][Category("基本")][DisplayName("是否是自增列")][ReadOnly(false)][DefaultValue(false)]public bool IsIncrementColumn{set { isIncrementColumn = value; }get { return isIncrementColumn; }}private Int64 identityIncrement;/// <summary>/// 标识增量/// </summary>[Browsable(true)][Category("基本")][DisplayName("标识增量")][ReadOnly(false)][Description("标识增量属性指定在 Microsoft SQL Server 为插入的行生成标识值时,在现有的最大行标识值基础上所加的值。标识增量必须是 非零 整数,位数等于或小于 10。")]public Int64 IdentityIncrement{set { identityIncrement = value; }get { return identityIncrement; }}private Int64 ident_Seed;/// <summary>/// 标识种子 /// </summary>[Browsable(true)][Category("基本")][DisplayName("标识种子")][ReadOnly(false)][Description("指示标识列的初始行值。标识种子必须是 整数,位数等于或小于 10。")]public Int64 Ident_Seed{set { ident_Seed = value; }get { return ident_Seed; }} }
实体类TestEntity代码如下:
public class TestEntity{private IdentityColumnEntity identityColumnInfo;/// <summary>/// 是否自增列/// </summary>[Category("扩展信息")][DisplayName("自增列信息")][ReadOnlyAttribute(true)][XmlIgnore][Browsable(true)]//[XmlAttribute]public IdentityColumnEntity IdentityColumnInfo{get{if (identityColumnInfo != null && identityColumnInfo.IsIncrementColumn){PropertyHandle.SetPropertyReadOnly(identityColumnInfo, "Ident_Seed", true);PropertyHandle.SetPropertyReadOnly(identityColumnInfo, "IdentityIncrement", true);PropertyHandle.SetPropertyReadOnly(identityColumnInfo, "IsIncrementColumn", true);PropertyHandle.SetPropertyReadOnly(this, "IsInsert", true);PropertyHandle.SetPropertyReadOnly(this, "IsUpdate", true);}return identityColumnInfo;}set{identityColumnInfo = value;}}/// <summary>/// 是否插入/// </summary>[Category("维护信息")][DisplayName("是否插入")][ReadOnlyAttribute(false)][XmlAttribute]public bool IsInsert{get;set;}/// <summary>/// 是否更新/// </summary>[Category("维护信息")][DisplayName("是否更新")][ReadOnlyAttribute(false)][XmlAttribute]public bool IsUpdate{get;set;}}
通过 PropertyHandle.SetPropertyReadOnly即可实现,效果如下:
演示源码:点击打开链接
本文参考: 如何在设计时中动态改变控件属性在PropertyGrid中显示出来的只读性
小注:
如何修改自定义属性的显示问题呢?
方法二:即参考文章中提到的:Unleash PropertyGrid with Dynamic Properties and Globalization
源码及演示demo下载:点击打开链接
C# 设计时动态改变实体在PropertyGrid中显示出来的属性相关推荐
- 触发器实现当一个表中字段改变时同时改变另一个表中字段值
触发器实现当一个表中字段发生变化时同时改变另一个表中字段 1.建表 新建两个表一个叫做Telephonics用来存放航班全部字段的数据,主键为SelfNum航迹号:另一个一个叫做FlightAndSe ...
- 微信小程序实现点击分享按钮时动态改变分享图片和标题
最近在做小程序时遇到一个需求,是一个商城小程序,在每个商品上都有一个分享按钮,点击这个分享按钮就可以分享这个商品,要求分享的内容是该商品的图片和标题. 这个需求把我难住了,大家都知道在触发分享时需要提 ...
- maven 打包时动态替换properties资源文件中的配置值
pom build节点下面添加resource配置: [html] view plaincopy <resources> <resource> <directory> ...
- android webview 字体 系统字体大小,Android 系统字体大小动态改变,导致webview中显示不兼容的问题解决...
唠叨几句: 在移动端再开发的过程中,很容易使用到webview,它也是用来混合开发的中间桥梁,因此解决webview使用过程中出现的问题是非常有必要的: 问题现象与发现: 现象: 日前,在是使用web ...
- [微信小程序]js动态改变数组对象列表中的样式
微信小程序开发交流qq群 173683895 承接微信小程序开发.扫码加微信. 正文: 这里我用微信小程序商城开发中选择商品规格选择做示例: 先把效果图让大家看看, 默认情况下是这样的 当 ...
- 安卓 background的图片随着textview的大小而改变_关于CSS中的背景属性background简述...
像我之前提到的那样,文档树中的每个元素只是一个矩形盒子.这些盒子都有一个背景层,背景层可以是完全透明或者其它颜色,也可以是一张图片.此背景层由8个CSS属性(加上1个简写的属性)控制. backgro ...
- Vue项目如何动态设置路由meta信息中的title属性值
场景:编辑.新建页面配置为同一个路由信息,期望不同页面的文档title展示不一样. 目前的配置如下,不能实现需求. 因此,我们需要动态的去设置meta的值.思路:借助Vue Router的路由独享守卫 ...
- wpf控件设计时支持(1)
wpf控件设计时支持(1) 原文:wpf控件设计时支持(1) 这部分内容几乎是大家忽略的内容,我想还是来介绍一下. 本篇源码下载 1.属性元数据 在vs IDE中,在asp.net,winfrom等开 ...
- vue在使用element时使用video视频地址切换视频动态改变
vue在使用element时使用video视频地址切换视频动态改变 今天用vue在写element的table时,在table中使用video动态渲染,但是渲染上的视频地址修改后,发现之前的视频还在, ...
最新文章
- X5本地应用打包服务器环境搭建
- http 三种认证方式 Basic Session Token 简介
- 3.2.1 造成误差的原因分析
- python爬取主播信息
- 简单示例立马搞懂Java日期格式中yyyy-MM-dd HH:mm:ss和YYYY-MM-dd hh:mm:ss的区别
- vue 路由参数变化,页面不刷新,provide /inject 完美解决方案
- c mysql命令_最基本的mysql命令
- linux 外壳的概念,LINUX当中必须知道的概念和小技巧
- Oracle loap函数,oracle分区表执行计划
- Python|泰坦尼克号幸存者画像
- 跨境电商独立站模式分析
- [转]百度Appollo无人车Perception Module 分析
- C语言中有bool类型吗?
- 下列不属于python保留字的是-以下哪个选项不是Python语言的保留字?
- ARM Linux的面试题
- 2019年5月7日公布的全国水质排行榜_全国城市水质排名一览表
- 脉冲神经网络:MATLAB实现脉冲神经网络(Spiking Neural Network,SNN) 用于图像分类(提供MATLAB代码)
- 【Python-OpenCV 人物素描】
- 转载--CST UTC CMT时间的区别和联系
- 《离散数学及其应用》读书笔记【三】计数