如何在程序运行中动态改变对象属性在PropertyGrid可见性和只读属性

来源:互联网 发布:风云排名知乎 编辑:程序博客网 时间:2024/05/01 12:44

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

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

'上面是cs的代码 以下是自己改的vb代码 测试通过

Function SetPropertyVisibility(ByVal obj As Object, ByVal propertyName As String, ByVal visible As Boolean)

        Dim mytype As Type = GetType(BrowsableAttribute)

        Dim props As PropertyDescriptorCollection = TypeDescriptor.GetProperties(obj) '得到一个属性集 

        Dim attrs As AttributeCollection = props(propertyName).Attributes

        Dim fld As FieldInfo = mytype.GetField("browsable", BindingFlags.Instance Or BindingFlags.NonPublic)

        fld.SetValue(attrs(mytype), visible)

        Return Nothing

End Function

'同一个类中调用的话 如下就OK了

SetPropertyVisibility(Me, "属性名称", True)


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/departure19841030/archive/2009/10/24/4720452.aspx