如何在设计时中动态改变控件属性在PropertyGrid中显示出来的只读性

fsqcy 2010-11-08 11:02:33
本人写控件时,在VS2005设计时中使用集合编辑器修改控件的属性值,集合编辑器中有一个PropertyGrid,大家知

道在类的某个属性中加[ReadOnlyAttribute(true)]声明标记后,此类的这个属性在PropertyGrid中就表现为灰色不

可更改(见下图)。本人的问题是:如果在PropertyGrid中我修改布尔属性TYPE为type1,则允许Value1和Value2在

PropertyGrid中修改,即Value1和Value2的ReadOnlyAttribute为true;如果我修改布尔属性TYPE为type2,则不允

许Value1和Value2修改,即Value1和Value2的ReadOnlyAttribute为false,在PropertyGrid中就表现为灰色不可更

改。请问大家如何实现?有没有什么办法动态改变控件属性在PropertyGrid中显示出来的只读性?

...全文
7051 11 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
daixin1031017817 2013-07-11
  • 打赏
  • 举报
回复
谢谢fsqcy 已经解决了 只要给属性加上[ReadOnlyAttribte(false)]特性就可以了
daixin1031017817 2013-07-11
  • 打赏
  • 举报
回复
引用 8 楼 fsqcy 的回复:
是否有其它更好的方法?
怎样单独修改一个属性为是否只读呢,我的是string类型 写上去所有的int类型的修改不了 string的也修改不了了
daixin1031017817 2013-07-11
  • 打赏
  • 举报
回复
怎样单独修改一个属性为是否只读呢,我的是string类型 写上去所有的int类型的修改不了 string的也修改不了了
fsqcy 2013-05-10
  • 打赏
  • 举报
回复
是否有其它更好的方法?
fsqcy 2013-03-24
  • 打赏
  • 举报
回复
此种方法对值类型属性有效,对类类型或其它类型属性,则由于其本身含有子属性,因此须特殊处理。可参考MSDN。
RexfieldVon 2013-03-11
  • 打赏
  • 举报
回复
引用 3 楼 fsqcy 的回复:
多谢 jiangsheng 指教!但你提供的方法比较复杂,还是使用以下方法较简单: 用反射可以实现动态改变,只读、可见等等,这些属性都可以改变。 以下两个方法分别实现可见性和只读属性的动态改变: void SetPropertyVisibility(object obj, string propertyName, bool v……
GoodJob! 但,貌似这个方法对List<>无效?
包龙星137 2013-02-20
  • 打赏
  • 举报
回复
您好!我想问一下怎样才能在修改布尔属性TYPE时候触发一个事件呢?“用反射可以实现动态改变”这种方式如何实现呢?哪位能指导下啊?
jjy263500 2011-10-13
  • 打赏
  • 举报
回复
我要用vs05做一个这样差不多的属性窗口,正发愁呢。网上没找到例子。
求工程代码,lhfjjy@126.com
可以的话发我邮箱吧,谢谢!!!
fsqcy 2010-11-23
  • 打赏
  • 举报
回复
多谢 jiangsheng 指教!但你提供的方法比较复杂,还是使用以下方法较简单:

用反射可以实现动态改变,只读、可见等等,这些属性都可以改变。

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

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

使用时,SetPropertyVisibility(obj, "名称 ", true);
obj指的就是你的SelectObject, “名称”是你SelectObject的一个属性
当然,调用这两个方法后,重新SelectObject一下,就可以了。
Teng_s2000 2010-11-09
  • 打赏
  • 举报
回复
蒋晟 2010-11-08
  • 打赏
  • 举报
回复
http://www.codeproject.com/KB/cs/dzdynamicproperties.aspx

8,833

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 组件/控件开发
社区管理员
  • 组件/控件开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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