不进则退

Roger's blog @cnblogs

导航

VS.NET Add-in在Design time获取控件值

客户要写一个Visual Studio .NET的Add-in,需要在design time获取form上控件的值,以下是用Reflection的做法

     

       Dim win As Window = applicationObject.ActiveWindow
            
Dim d As ComponentModel.Design.IDesignerHost = win.Object
            iss 
= d.GetService(GetType(ComponentModel.Design.ISelectionService))
            
Dim c As ComponentModel.Component = iss.PrimarySelection
            
Dim pi As Reflection.PropertyInfo = CObj(c).GetType().GetProperty("Visible")
            
            
Dim val As Object = pi.GetValue(c, Nothing)
            
Dim tc As System.ComponentModel.TypeConverter = ComponentModel.TypeDescriptor.GetConverter(val)
            
MsgBox(c.Site.Name & "." & pi.Name & " = " & tc.ConvertToString(val))


这样做有一个问题,当我要取TextBox.Visible这类属性的时候,返回值永远为true,因为reflect的是designer中的textbox对象,它的visible值永远为true。正确的做法是通过PropertyDescriptorCollection来读取Properties window里面的值,代码如下:

  
   
           
'query Properties
            Dim properties As System.ComponentModel.PropertyDescriptorCollection
            properties 
= System.ComponentModel.TypeDescriptor.GetProperties(c)
            
Dim prop As System.ComponentModel.PropertyDescriptor
            prop 
= properties("Visible")
            
MsgBox(c.Site.Name & "." & prop.Name & " = " & prop.GetValue(c))

本贴子以“现状”提供且没有任何担保,同时也没有授予任何权利

posted on 2005-04-05 14:44  Roger Wo  阅读(1360)  评论(2编辑  收藏  举报