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

时间: 2024-11-10 10:42:18

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

php正则取img标记中任意属性(正则替换去掉或改变图片img标记中的任意属性)_php技巧

因有一项目新闻发布系统,数据库内容字段中存储的是原图的路径(当然还有其他文字内容啦,内容里插图时,存的是图片路径),但前台想使用缩略图,琢磨1小时余,得到以下结果,可解决问题(取img标签会了,取别的标签任意属性自然也会了): 复制代码 代码如下: <?php /*正则取图片img标记中的任意属性*/ $word = '<p height="22" align="cenetr">111 22</p> <img src="

javascript动态改变表格单元格中的内容

说到用js动态的改变td里面的内容,我们就会想到dom 是吧,下面来看看简单的代码 <TABLE id="table1" border=1 width="150"> <TR> <TD align="center" width="50%">0,0</TD> <TD align="center">0,1</TD> </TR> &

Javascript 动态改变imput type属性_基础知识

Javascript 动态改变imput type属性: 代码实现: <script type="text/javascript"> function shoppw(thebox){ var ps = document.getElementById('ps'); var pass = document.getElementById('pass'); ps.removeChild(pass); var psImput = document.createElement(&quo

为ASP.NET控件添加设计时支持

asp.net|控件|设计 简介 Microsoft ASP.NET 为开发人员提供了一种适用于 Web 开发的.功能最为强大的新工具:服务器控件.服务器控件使开发人员能够在短时间内开发出响应速度快而且功能强大的 Web 应用程序,所需的时间与在典型的 ASP 中创建类似应用程序的时间差不多. ASP.NET 服务器控件之所以能够提供生产效率,关键原因之一在于它为 Microsoft Visual Studio .NET 开发环境中的服务器控件提供了丰富的设计时支持.开发人员可以将服务器控件从

JavaScript动态改变网页图片大小

在自己的网站上更新文章时一个比较常见的问题是:文章插图太宽,使整个网页都变形了.如果对每个插图都先进行缩放再插入的话,太麻烦了. 我前段时间写的一篇文章就遇到过这种事情,后来用CSS的overflow和max-width属性暂时解决了页面变形的问题.这种方法好处是简单,但坏处是会破坏某些细节的效果. 如overflow:hidden,意思是当内部元素宽度大于父框架时隐藏超出宽度的部分.这样做可能会是一些内容突然截断,被隐藏了,很对不起观众. 通过max-width属性限制文章插图最大宽度的话,需

如何在网页中动态改变样式

动态|网页 要实现动态网页,方案有很多,其中通过CSS来动态改变界面样式是网页设计者最喜欢使用的技术. 在使用CSS样式动态改变界面样式中,大家通常是定义多个CLASS样式对象,然后在JAVASCRIPT(或VBSCRIPT)脚本中设置对象的class属性为某一个指定的样式Class名或直接修改对象的STYLE属性实现.这些方法在修改少量有限的样式时是非常有效的,但如果要对整个页面的元素对象的样式进行变动时,便会感到非常的麻烦了. 这里提供一个通过动态加载CSS样式文件来实现界面样式动态修改的方

Asp.Net中页面运行时动态载入的UserControl内元素的事

在Asp.Net页面的开发过程中,我们肯定经常会用到自定义的UserControl来复用部分页面元素,我们有两种使用UserControl的方式 1.在设计时往页面里添加需要的UserControl(最常用的就是从SolutionExplorer拖ascx到设计页面) 此种情况下,如果将UserControl放置在runat=server的html标签中,将可能导致UserControl内的元素事件处理不能正确执行. 例如:我们有时用一个div作为边框包含了需要的UserControl,而出于在

网页设计时必须思考的5个网页设计目标

文章描述:我在以下列出的5个目标,是在每一次开始网页设计时都必须思考的. 这是最近看到的一篇很不错很实用的文章,主要侧重于设计前的思考.思路,看完有很大的启发,所以推荐给大家,因为是翻译的,翻译不准确的地方还请见谅~ 在生活中,拥有目标是非常重要的. 特别对于网站设计而言,因为没有目标就没有动力,更无法衡量你的成功与否. 目标有助于设计师专注于重要的事情,把握设计方案的走向.目标能帮助设计者设计出令人眼前一亮的网站. 设计任何一个网站,过程都是大同小异的:我完成了一份设计稿,然后把它交给客户.虽

用VC实现动态改变Windows的显示特性

对于Windows平台,显示器的分辩率.颜色数.刷新率等特性很重要,尤其是对于多媒体 应用软件和游戏软件.在很多情况下,用户当前的屏幕设置并不适合软件的运行需要,软件 通常的做法是提示用户将屏幕设置到软件要求的分辩率及颜色数,再重新启动软件.这样无 疑会增加普通用户操作上的负担和困难,降低了软件的友好性和易用性.理想的作法是:在 软件开始时,动态的改变屏幕设置来达到软件运行的要求.在软件运行结束后,再自动把屏 幕设置改回原来的设置值.这一切过程都在不知不觉中完成.本例演示了动态设置系统显示 分辩