通过函数获取标签

时间:2016-10-14 17:29:40

标签: vb.net

一切!我正在开发一款BlackJack游戏,但我遇到了一些问题。在计算得分时,我必须输入YourCard1.Text,YourCard2.Text,YourCard3.Text等。 我可以在每次调用时创建一个能够获得正确标签的函数吗?我想这样做,所以我不必打那么多......

例如,我不想输入“YourCard1.Text”,而是希望能够输入“card(1)”这可能吗?我尝试了多种方法,但无济于事。我无法弄清楚如何让它发挥作用。

1 个答案:

答案 0 :(得分:0)

假设您的表单上有这些标签,YourCard1.Text,YourCard2.Text,YourCard3.Text等,此功能应该适合您。它返回Label本身,而不是Text属性。

Private Function card(index As Integer) As Label
    Try
        Return Me.Controls.
            OfType(Of Label).
            Where(Function(l) l.Name = "YourCard" & index.ToString()).
            Single()
    Catch
        Return Nothing
    End Try
End Function

注意:Me.Controls直接在表单内返回控件,但不返回表单中容器内的控件。如果您的卡位于面板中,例如Panel1,则可以执行Return Panel1.Controls.OfType(Of Label)...

用法:

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    card(1).Text = "Hello"
    card(2).Text = "World"
End Sub

enter image description here

编辑以发表评论。

你只是在那些语义中。所以还有另一种我能想到的方式。但我不会亲自这样做。

Public Class Form1

    Private Class cardClass
        Private myContainer As Control
        Sub New(container As Control)
            myContainer = container
        End Sub

        Default Public WriteOnly Property Item(ByVal index As Long) As String
            Set(value As String)
                card(index).Text = value
            End Set
        End Property

        Private Function card(index As Integer) As Label
            Try
                Return myContainer.Controls.
                    OfType(Of Label).
                    Where(Function(l) l.Name = "YourCard" & index.ToString()).
                    Single()
            Catch
                Return Nothing
            End Try
        End Function
    End Class

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Dim card As New cardClass(Me)
        card(1) = "Hello"
        card(2) = "World"
    End Sub

End Class

它如此复杂的原因是虽然String是引用类型,但它使用值类型语义。因此,当从函数返回一个字符串时,它不能返回原始内存位置:它实际上创建了一个字符串的副本。所以使用函数语义是行不通的。数组也是如此。从函数或数组修改字符串并修改Label的Text属性将是困难的(不可能?)。