如何在ControlDesigner中获取继承的Form类型

时间:2014-05-25 21:19:22

标签: vb.net winforms inheritance designer

我正在构建一个自定义设计器,它将控件与表单上的业务属性相关联。表格DealUI具有属性Instrument和Product,它们是商业项目:

    Public Class DealUI
        Inherits System.Windows.Forms.Form ' repetition of Inherits in Deal.Designed.vb, just to make the point

    Sub New()
        InitializeComponent()
    End Sub

    <Business(True)> _
    Public Property Product As String

    <Business(True)> _
    Public Property Instrument As String

End Class

Business属性只是

NotInheritable Class BusinessAttribute
    Inherits Attribute

    Private _isBusiness As Boolean

    Sub New(isBusiness As Boolean)
        _isBusiness = isBusiness
    End Sub

End Class

表单包含一个自定义控件,类型为PilotTextBox的ProductTextBox:

<DesignerAttribute(GetType(PilotControlDesigner)), _
ToolboxItem(GetType(PilotToolboxItem))> _
Public Class PilotTextBox
    Inherits TextBox

    Public Property Source As String

End Class

在设计器中,当所选控件更改为ProductTextbox时,我想使用具有BusinessAttribute(仪器和产品)的Form属性的名称填充其Source属性,然后用户可以在Instrument和Product之间进行选择。设计师代码是

Public Class PilotControlDesigner
    Inherits ControlDesigner

    Private Sub InitializeServices()
        Me.selectionService = GetService(GetType(ISelectionService))
        If (Me.selectionService IsNot Nothing) Then
            AddHandler Me.selectionService.SelectionChanged, AddressOf selectionService_SelectionChanged
        End If
    End Sub

    Private Sub selectionService_SelectionChanged(ByVal sender As Object, ByVal e As EventArgs)
        If Me.selectionService IsNot Nothing Then
            If Me.selectionService.PrimarySelection Is Me.Control Then
                Dim form As Object = DesigningForm()
                If form IsNot Nothing Then
                    For Each prop As PropertyInfo In form.GetType.GetProperties
                        Dim attr As Attribute = GetCustomAttribute(prop.ReflectedType, GetType(BusinessAttribute), False)
                        If attr IsNot Nothing Then
                            ' we've found a Business attribute
                        End If
                    Next
                End If

            End If
        End If
    End Sub

    Private Function DesigningForm() As Object ' in fact, a form, or more precisely something that inherits from Form
        Dim host As IDesignerHost = CType(Me.Component.Site.GetService(GetType(IDesignerHost)), IDesignerHost)
        Dim container As IContainer = host.Container
        For Each comp As Component In container.Components
            If comp.GetType.IsAssignableFrom(GetType(Form)) Then ' or anything that inherits 'Form'
                return comp ' returns a Form, not a Deal!!
            End If
        Next comp
        Return nothing
    End Function

End Class

所选控件是Deal(继承自Form),但设计器中的组件是Form,而不是Deal(评论中的!!)。我需要检查仪器和产品属性,它们只存在于交易中。

如何在设计器中获取 Deal 对象?

0 个答案:

没有答案