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

简介: 方法一: /// <summary> /// 实体属性处理 /// </summary> public class PropertyHandle { #region 反射控制只读、可见属性 //SetPropertyVisibility(obj, "名称 ", true);

方法一:

    /// <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下载:点击打开链接






相关文章
|
2月前
|
JavaScript 前端开发 定位技术
HTML新特性【账号和获取密钥、初始化、变更地图类型、添加控件、改变控件位置、添加覆盖物、自定义标注图标、添加文本标注】(四)-全面详解(学习总结---从入门到深化)(上)
HTML新特性【账号和获取密钥、初始化、变更地图类型、添加控件、改变控件位置、添加覆盖物、自定义标注图标、添加文本标注】(四)-全面详解(学习总结---从入门到深化)
44 0
|
10月前
基于参数关联关系动态呈现参数
本场景以计费方式为例,为您介绍资源编排如何在计费方式为包年包月时动态呈现包年包月的单位和时长。
36 0
|
数据库
因祸得福——创建视图时改变字段的类型
因祸得福——创建视图时改变字段的类型
120 0
关于Navisworks属性查看的问题(属性不显示)
关于Navisworks属性查看的问题(属性不显示)
关于Navisworks属性查看的问题(属性不显示)
QtApplets-自定义控件-6-属性研究(未成功)
QtApplets-自定义控件-6-属性研究(未成功)
126 0
QtApplets-自定义控件-6-属性研究(未成功)
附加属性的不同使用方式
原文:附加属性的不同使用方式     [AttachedPropertyBrowsableForType(typeof(ButtonBase))] public static void SetIsClearTextButtonBehaviorEnabled(Button obj, bool value) { obj.
744 0
附加属性来控制控件中,要扩展模块的visibility
原文:附加属性来控制控件中,要扩展模块的visibility 可解决: 文本框控件中的按钮,DataGridColumnHeader中加入Filter控件。。。 cs文件中的 附加属性 + 样式文件中的 template+控件 -> visibility , 制作出  XAML文件中        1.
788 0
Focusable 属性和IsTabStop 属性之间的关系
原文:Focusable 属性和IsTabStop 属性之间的关系 版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Libby1984/article/details/54881460 控件的Focusable 属性确定控件是否允许接收键盘输入焦点,控件的 IsTabStop 属性确定是否允许通过Tab键导航到控件。
1066 0
|
C# 数据安全/隐私保护
WPF 使用附加属性增加控件属性
原文:WPF 使用附加属性增加控件属性 使用附加属性增加控件属性,使得这个附加属性在使用的时候没有局限性,可以在任何的控件中使用它来增加所需要的属性,使得控件的属性使用起来非常灵活   一、自定义附加属性 1 2 3 4 5 6 7 8 9 10 11 ...
873 0
绑定元素属性改变不通知界面
原文:绑定元素属性改变不通知界面 情景假设:绑定的是一个Point,当Point的X或者Y属性发生改变时,绑定的点也随界面改变 此时界面不会发生改变 原因:当X或者Y属性发生改变时并没有触发Point的Set方法   1 2 3 ...
606 0

热门文章

最新文章