一切!我正在开发一款BlackJack游戏,但我遇到了一些问题。在计算得分时,我必须输入YourCard1.Text,YourCard2.Text,YourCard3.Text等。 我可以在每次调用时创建一个能够获得正确标签的函数吗?我想这样做,所以我不必打那么多......
例如,我不想输入“YourCard1.Text”,而是希望能够输入“card(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
编辑以发表评论。
你只是在那些语义中。所以还有另一种我能想到的方式。但我不会亲自这样做。
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属性将是困难的(不可能?)。