如何在设计时中动态改变控件属性在PropertyGrid中显示出来的只读性
本人写控件时,在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中显示出来的只读性?
--------------------编程问答-------------------- http://www.codeproject.com/KB/cs/dzdynamicproperties.aspx --------------------编程问答-------------------- --------------------编程问答-------------------- 多谢 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一下,就可以了。
--------------------编程问答-------------------- 我要用vs05做一个这样差不多的属性窗口,正发愁呢。网上没找到例子。
求工程代码,lhfjjy@126.com
可以的话发我邮箱吧,谢谢!!! --------------------编程问答-------------------- 您好!我想问一下怎样才能在修改布尔属性TYPE时候触发一个事件呢?“用反射可以实现动态改变”这种方式如何实现呢?哪位能指导下啊? --------------------编程问答--------------------
GoodJob!
但,貌似这个方法对List<>无效? --------------------编程问答-------------------- 此种方法对值类型属性有效,对类类型或其它类型属性,则由于其本身含有子属性,因此须特殊处理。可参考MSDN。 --------------------编程问答-------------------- 是否有其它更好的方法? --------------------编程问答-------------------- 怎样单独修改一个属性为是否只读呢,我的是string类型 写上去所有的int类型的修改不了 string的也修改不了了 --------------------编程问答-------------------- 怎样单独修改一个属性为是否只读呢,我的是string类型 写上去所有的int类型的修改不了 string的也修改不了了 --------------------编程问答-------------------- 谢谢fsqcy 已经解决了 只要给属性加上[ReadOnlyAttribte(false)]特性就可以了
补充:.NET技术 , 组件/控件开发