如何在程序运行中动态改变对象属性在PropertyGrid中显示出来的只读性(100分求助)

springgump 2006-05-08 09:25:21
大家知道在类的某个属性中加[ReadOnlyAttribute(true)]声明标记后,此类的对象的这个属性在PropertyGrid中就表现为灰色不可更改,请问大家有没有什么办法动态地让这个属性在PropertyGrid中的显示变为可读写么?
以下的方法试过,不好用
1、想在程序里改声明标记,可是不行
2、另外写个类,同样的属性标记为[ReadOnlyAttribute(false)],然后重新selectobject,可是太复杂了。

请问大家有什么好办法吗?
...全文
773 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
iseelxj 2006-10-23
  • 打赏
  • 举报
回复
你想改变的属性上面必须要有 Browsable(false) 或着 ReadOnly(true) 的控制,才能只变一个属性
yuanzhihua520 2006-10-23
  • 打赏
  • 举报
回复
up
xqb0010 2006-05-12
  • 打赏
  • 举报
回复
我的也是控制全部啊,并不是控制单个?楼主怎么解决的?
springgump 2006-05-08
  • 打赏
  • 举报
回复
回复:FutureStonesoft(丑石)
用了SetPropertyVisibility方法,整个对象的属性全部不见了。用了SetPropertyReadOnly没有反应。我再调试调试吧。先谢谢了。
springgump 2006-05-08
  • 打赏
  • 举报
回复
to:Knight94(愚翁)
程序的目的是想有时候可以让用户修改属性,有时候又不让。
Knight94 2006-05-08
  • 打赏
  • 举报
回复
to 属性是public 的,是可以get 和set 的

这我就觉得很奇怪了,如果属性可以get 和set,为什么还要加ReadOnly标示;
一般的习惯,只要加上ReadOnly标示,就不会提供属性set方法。
springgump 2006-05-08
  • 打赏
  • 举报
回复
回复Knight94(愚翁),属性是public 的,是可以get 和set 的
谢谢诸位,晚上测试一下,能用马上就结贴,各位还有什么其他方法不吝赐教。
顺便顶一下。
Knight94 2006-05-08
  • 打赏
  • 举报
回复
如果属性没有提供可写方法,即使修改属性的可读属性,你也无法给出属性可写方法。
duncansun 2006-05-08
  • 打赏
  • 举报
回复
帮你顶一下
FutureStonesoft 2006-05-08
  • 打赏
  • 举报
回复
使用时,SetPropertyVisibility(obj, "名称", true);
obj指的就是你的SelectObject, “名称”是你SelectObject的一个属性
当然,调用这两个方法后,重新SelectObject一下,就可以了
FutureStonesoft 2006-05-08
  • 打赏
  • 举报
回复
用反射可以实现动态改变,只读、可见等等,这些属性都可以改变。

以下两个方法分别实现可见性和只读属性的动态改变:

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);
}

void SetPropertyReadOnly(object obj, string propertyName, bool readOnly)
{
Type type = typeof(System.ComponentModel.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);
}
Eddie005 2006-05-08
  • 打赏
  • 举报
回复
的确,除了重写属性之外没什么更好的办法...
Knight94 2006-05-08
  • 打赏
  • 举报
回复
建议还是使用第二种方法,即屏蔽原先的属性,用新写的属性代替。
springgump 2006-05-08
  • 打赏
  • 举报
回复
谢谢FutureStonesoft(丑石)!!!
结贴!

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧