通过反射取设计画面里面控件的特殊属性问题
通过反射取属性列表,相信大家都知道。
System.ComponentModel.TypeDescriptor.GetProperties
我们看到在MSDN里面,GetProperties一共有六个重载列表。我们现在只说两个:
(1) GetProperties(componentType As Type)
(2) GetProperties(component As Object)
比如设计画面上面有个TextBox,我们从DesignHost.Container.Components里面把这个TextBox找出来,姑且定义为
c As Component。
然后我们用方法(1) GetProperties(CObj(c).GetType)取属性,一切正常。但是如果把TextBox.Visible在PropertyWindow里面设置为False的话,我们将会看到通过方法(1),我们仍旧只能取到True。
但是如果我们使用方法(2),GetProperties(c),就可以正确取出False。
同样的问题还会出现在Enabled属性上面,但是其它的属性都没有这样的问题。所以我感觉是这两个属性的问题。Visible和Enabled的变化,并没有让Design画面里面的控件发生改变。比如Visible=False,Design画面里面这个控件仍旧是显示的。所以我怀疑通过方法(1)我们只能取得Design画面上面的控件,而通过方法(2)我们得到的才是运行时的控件对象。
System.ComponentModel.TypeDescriptor.GetProperties
我们看到在MSDN里面,GetProperties一共有六个重载列表。我们现在只说两个:
(1) GetProperties(componentType As Type)
(2) GetProperties(component As Object)
比如设计画面上面有个TextBox,我们从DesignHost.Container.Components里面把这个TextBox找出来,姑且定义为
c As Component。
然后我们用方法(1) GetProperties(CObj(c).GetType)取属性,一切正常。但是如果把TextBox.Visible在PropertyWindow里面设置为False的话,我们将会看到通过方法(1),我们仍旧只能取到True。
但是如果我们使用方法(2),GetProperties(c),就可以正确取出False。
同样的问题还会出现在Enabled属性上面,但是其它的属性都没有这样的问题。所以我感觉是这两个属性的问题。Visible和Enabled的变化,并没有让Design画面里面的控件发生改变。比如Visible=False,Design画面里面这个控件仍旧是显示的。所以我怀疑通过方法(1)我们只能取得Design画面上面的控件,而通过方法(2)我们得到的才是运行时的控件对象。