博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C# 设计时动态改变实体在PropertyGrid中显示出来的属性
阅读量:6322 次
发布时间:2019-06-22

本文共 4416 字,大约阅读时间需要 14 分钟。

方法一:

///     /// 实体属性处理    ///     public class PropertyHandle    {        #region 反射控制只读、可见属性        //SetPropertyVisibility(obj,   "名称 ",   true);         //obj指的就是你的SelectObject,   “名称”是你SelectObject的一个属性         //当然,调用这两个方法后,重新SelectObject一下,就可以了。        ///         /// 通过反射控制属性是否只读        ///         ///         ///         ///         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);        }        ///         /// 通过反射控制属性是否可见        ///         ///         ///         ///         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;        ///         /// 是否是自增列        ///         [Browsable(true)]        [Category("基本")]        [DisplayName("是否是自增列")]        [ReadOnly(false)]        [DefaultValue(false)]        public bool IsIncrementColumn        {            set { isIncrementColumn = value; }            get { return isIncrementColumn; }        }        private Int64 identityIncrement;        ///         /// 标识增量        ///         [Browsable(true)]        [Category("基本")]        [DisplayName("标识增量")]        [ReadOnly(false)]        [Description("标识增量属性指定在 Microsoft SQL Server 为插入的行生成标识值时,在现有的最大行标识值基础上所加的值。标识增量必须是 非零 整数,位数等于或小于 10。")]        public Int64 IdentityIncrement        {            set { identityIncrement = value; }            get { return identityIncrement; }        }        private Int64 ident_Seed;        ///         /// 标识种子         ///         [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;        ///         /// 是否自增列        ///         [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;            }        }        ///         /// 是否插入        ///         [Category("维护信息")]        [DisplayName("是否插入")]        [ReadOnlyAttribute(false)]        [XmlAttribute]        public bool IsInsert        {            get            ;            set            ;        }        ///         /// 是否更新        ///         [Category("维护信息")]        [DisplayName("是否更新")]        [ReadOnlyAttribute(false)]        [XmlAttribute]        public bool IsUpdate        {            get            ;            set            ;        }    }
通过 PropertyHandle.SetPropertyReadOnly即可实现,效果如下:

演示源码:

本文参考: 

小注:

方法二:即参考文章中提到的:

源码及演示demo下载:

你可能感兴趣的文章
获中科院战略投资,开启人工智能大应用时代
查看>>
Vue 实战 (一) -- Vue 基础总结
查看>>
为什么说 Java 程序员到了必须掌握 Spring Boot 的时候?
查看>>
Spring Cloud Data Flow 2.0.1 GA 发布
查看>>
WPS Office 2019 For Linux 8372 个人版发布
查看>>
Google Material Design的图标字体使用教程
查看>>
祝贺| 蚂蚁金服年轻交互设计师陈凯翔,荣获HCII 2018 最佳论文奖
查看>>
强大的脚手架:vue-cli 3.x UI控制台初体验
查看>>
Android二级缓存之物理存储介质上的缓存DiskLruCache
查看>>
有了新款无人机Goblin,探测金属更简单
查看>>
倚靠超算NVIDIA DGX-1,OpenAI开始教AI刷论坛
查看>>
Spring配置中的"classpath:"与"classpath*:"的区别研究(转)
查看>>
Lisp 是怎么成为上帝的编程语言的
查看>>
Mozilla 将推出全新的安卓移动浏览器 Fenix
查看>>
被反病毒软件误伤,Mozilla 暂停 Firefox 65 更新
查看>>
用友优普智能制造助华菱线缆实现3个人15亿排产
查看>>
PostgreSQL 多值类型(如数组),元素值全局唯一 - 约束如何实现
查看>>
剖析区块链的价值与机遇
查看>>
利用openSSL 生成RSA公钥和密钥
查看>>
Python xrange与range的区别
查看>>