方法一:

    /// <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. 触发器实现当一个表中字段改变时同时改变另一个表中字段值

    触发器实现当一个表中字段发生变化时同时改变另一个表中字段 1.建表 新建两个表一个叫做Telephonics用来存放航班全部字段的数据,主键为SelfNum航迹号:另一个一个叫做FlightAndSe ...

  2. 微信小程序实现点击分享按钮时动态改变分享图片和标题

    最近在做小程序时遇到一个需求,是一个商城小程序,在每个商品上都有一个分享按钮,点击这个分享按钮就可以分享这个商品,要求分享的内容是该商品的图片和标题. 这个需求把我难住了,大家都知道在触发分享时需要提 ...

  3. maven 打包时动态替换properties资源文件中的配置值

    pom build节点下面添加resource配置: [html] view plaincopy <resources> <resource> <directory> ...

  4. android webview 字体 系统字体大小,Android 系统字体大小动态改变,导致webview中显示不兼容的问题解决...

    唠叨几句: 在移动端再开发的过程中,很容易使用到webview,它也是用来混合开发的中间桥梁,因此解决webview使用过程中出现的问题是非常有必要的: 问题现象与发现: 现象: 日前,在是使用web ...

  5. [微信小程序]js动态改变数组对象列表中的样式

    微信小程序开发交流qq群   173683895    承接微信小程序开发.扫码加微信. 正文: 这里我用微信小程序商城开发中选择商品规格选择做示例: 先把效果图让大家看看,  默认情况下是这样的 当 ...

  6. 安卓 background的图片随着textview的大小而改变_关于CSS中的背景属性background简述...

    像我之前提到的那样,文档树中的每个元素只是一个矩形盒子.这些盒子都有一个背景层,背景层可以是完全透明或者其它颜色,也可以是一张图片.此背景层由8个CSS属性(加上1个简写的属性)控制. backgro ...

  7. Vue项目如何动态设置路由meta信息中的title属性值

    场景:编辑.新建页面配置为同一个路由信息,期望不同页面的文档title展示不一样. 目前的配置如下,不能实现需求. 因此,我们需要动态的去设置meta的值.思路:借助Vue Router的路由独享守卫 ...

  8. wpf控件设计时支持(1)

    wpf控件设计时支持(1) 原文:wpf控件设计时支持(1) 这部分内容几乎是大家忽略的内容,我想还是来介绍一下. 本篇源码下载 1.属性元数据 在vs IDE中,在asp.net,winfrom等开 ...

  9. vue在使用element时使用video视频地址切换视频动态改变

    vue在使用element时使用video视频地址切换视频动态改变 今天用vue在写element的table时,在table中使用video动态渲染,但是渲染上的视频地址修改后,发现之前的视频还在, ...

最新文章

  1. X5本地应用打包服务器环境搭建
  2. http 三种认证方式 Basic Session Token 简介
  3. 3.2.1 造成误差的原因分析
  4. python爬取主播信息
  5. 简单示例立马搞懂Java日期格式中yyyy-MM-dd HH:mm:ss和YYYY-MM-dd hh:mm:ss的区别
  6. vue 路由参数变化,页面不刷新,provide /inject 完美解决方案
  7. c mysql命令_最基本的mysql命令
  8. linux 外壳的概念,LINUX当中必须知道的概念和小技巧
  9. Oracle loap函数,oracle分区表执行计划
  10. Python|泰坦尼克号幸存者画像
  11. 跨境电商独立站模式分析
  12. [转]百度Appollo无人车Perception Module 分析
  13. C语言中有bool类型吗?
  14. 下列不属于python保留字的是-以下哪个选项不是Python语言的保留字?
  15. ARM Linux的面试题
  16. 2019年5月7日公布的全国水质排行榜_全国城市水质排名一览表
  17. 脉冲神经网络:MATLAB实现脉冲神经网络(Spiking Neural Network,SNN) 用于图像分类(提供MATLAB代码)
  18. 【Python-OpenCV 人物素描】
  19. 转载--CST UTC CMT时间的区别和联系
  20. 《离散数学及其应用》读书笔记【三】计数

热门文章

  1. IT小妙招之:快马加鞭,Windows 7启动大提速
  2. JNI命令行下编译错误解决方案
  3. 原生、无依赖的web弹层组件——HLayer.js
  4. .net程序员转战android第三篇---登录模块之静态登录
  5. Discuz! 6.0.0 安装图文教程
  6. gedit emacs
  7. 在vscode中使用pylint-django插件解决pylint的一些不必要的错误提示【转】
  8. bootstrap-table对前台页面表格的支持
  9. p ython笔记第一天
  10. Linux 管理员手册(2)