自定义属性,与`set`上的父类进行交互

时间:2015-11-12 18:43:00

标签: .net vb.net class properties scope

我正在尝试构建自定义属性。

当我设置属性时,我想与父对象中的对象进行交互。对于我的生活,我似乎无法弄明白。我继续犯同样的错误。

"如果没有初始化的显式实例,则无法在共享方法或成员中引用类的实例或成员"

+2^31 - 1 = +2147483647

额外信息

无论我在这里做出哪些努力(这可能是完全错误的做法,这是我本来想要做的。)

我有一个usercontrol(uc)。在我的usercontrol上,我有一个标签(l)。

我通常可以使用控件从我的表单中调用uc.l.这样我就可以直接从使用usercontrol的表单代码中与标签进行交互。

我现在要做的是,基本上"隐藏" l,(我不希望调用表单能够直接与标签交互)。

我想在uc中创建一个可访问的自定义对象,只显示2个属性。

当从调用usercontrol的表单设置这些属性时,我想从我为自定义对象创建的新属性设置器中设置原始标签的属性。

我可以很容易地在UC本身创建两个属性,一个用于(l)文本,一个用于(l)颜色。

但我在uc上有多个标签,我想为每个标签引用一个自定义对象,公开特定的自定义属性。

我希望这是有道理的。

2 个答案:

答案 0 :(得分:1)

显然,c_heading1意味着在某种程度上反映或控制标签。为此,只需使用实际标签作为某些新属性的支持字段:

加上新信息: 我有3个标签......我不想创建6个属性

Public Class UC

    Public Property HeadingA As HeaderLabel
    Public Property HeadingB As HeaderLabel
    Public Property HeadingC As HeaderLabel

    Public Sub New()

        ' This call is required by the designer.
        InitializeComponent()

        ' Add any initialization after the InitializeComponent() call.

        ' important
        HeadingA = New HeaderLabel(Label1)
        HeadingB = New HeaderLabel(Label2)
        HeadingC = New HeaderLabel(Label3)

    End Sub

    Public Class HeaderLabel
        Public Property Text As String
            Get
                Return myLabel.Text
            End Get
            Set(value As String)
                ' do something fabulous
                myLabel.Text = value
            End Set
        End Property

        Public Property Color As Color
            Get
                Return myLabel.BackColor
            End Get
            Set(value As Color)
                ' do soemthing else fabulous
                myLabel.BackColor = value
            End Set
        End Property


        Private myLabel As Label
        Public Sub New(lbl As Label)
            myLabel = lbl
        End Sub

    End Class

End Class

I dont want the calling form to be able to interact with the label directly

如果您在UserControl上将Modifiers属性设置为Private,则表单将无法再引用它。

用法:

    Uc1.HeadingA.Text = "Something Fabulous"
    Uc1.HeadingA.Color = Color.AliceBlue

答案 1 :(得分:0)

我最终得到了这个。我想在这个例子中直接从_load这里调用.text和.color,但是在@Plutonix的帮助下,我认为这不可能吗?

Public Class awsumlistItem

    Private new_heading1 As LabelProperties
    Public Property heading1 As LabelProperties
        Get
            Return new_heading1
        End Get
        Set(ByVal value As LabelProperties)
            new_heading1 = value
            h1.Text = new_heading1.text
            h1.color = new_heading1.color
        End Set
    End Property

    Private new_heading2 As LabelProperties
    Public Property heading2 As LabelProperties
        Get
            Return new_heading2
        End Get
        Set(ByVal value As LabelProperties)
            new_heading2 = value
        End Set
    End Property

    Private new_heading3 As LabelProperties
    Public Property heading3 As LabelProperties
        Get
            Return new_heading3
        End Get
        Set(ByVal value As LabelProperties)
            new_heading3 = value
        End Set
    End Property

    Public Class LabelProperties

        Public Property text() As String
        Public Property color() As System.Drawing.Color

    End Class


    Private Sub awsumlistItem_Load(sender As Object, e As EventArgs) Handles MyBase.Load

        '  Me.Dock = DockStyle.Fill

        Dim myHeading1 As New LabelProperties

        With myHeading1
            .text = "blah blah"
            .color = System.Drawing.Color.Aqua
        End With

        heading1 = myHeading1


    End Sub



End Class