0

我是 Visual Basic 和一般编程的新手,但我正在尝试制作一个统计计数器类的程序。我正在尝试使用变量来引用文本框,例如 k_kills(i) = txtKills(i).Text。但是,这不起作用,所以我尝试了以下方法:

For i = 0 To 8
            Dim tempBox As TextBox
            Dim tempName As String = "txtKills" & i.ToString
            tempBox = Me.Controls.Item(tempName)

            k_kills(i) = tempBox.Text
Next

这也不起作用,并且每次说“tempBox 什么都不是”时都会吐出一个错误。

谁能告诉我我能不能完成这项工作?

谢谢。

4

3 回答 3

2

您将需要在某个集合中找到控件。默认情况下,控件将存在于其父控件的Controls 属性中,并且由于您试图通过其名称获取控件,因此您可以使用 ControlCollection 的Find 方法。如果您可以保证控件的父级是表单,那么您可以调用:

Dim tempBox As TextBox = DirectCast(Me.Controls.Find(tempName, False), TextBox)

但是,如果控件的父级可能不是表单,那么您会调用:

Dim tempBox As TextBox = DirectCast(Me.Controls.Find(tempName, True), TextBox)

第一个会执行得稍微快一些,因为它只迭代当前的 ControlCollection,而第二个可能需要更长的时间,因为如果它在当前 ControlCollection 中找不到控件,那么它也会开始迭代子控件。

于 2019-12-12T17:39:05.650 回答
0

假设控件都在 Form 作为父控件,并且它们都以 txtKills 开头...如果您要将这些文本框作为一个组用于多个操作,您可能需要构建一个 TextBox 数组或列表。

Dim Kills(7) As TextBox

Private Sub CreateTextBoxArray()
   Dim index As Integer
   For Each ctrl As Control In Controls
        If ctrl.Name.StartsWith("txtKills") Then
            Kills(index) = DirectCast(ctrl, TextBox)
            index += 1
        End If
    Next
End Sub

Private Sub ClearKillTextBoxes()
    For Each t In Kills
        t.Clear()
    Next
End Sub

Private Function GetTextFromKillBoxes() As List(Of String)
    Dim lst As New List(Of String)
    For Each t In Kills
        lst.Add(t.Text)
    Next
    Return lst
End Function
于 2019-12-13T08:54:09.347 回答
0

在 Mary 的评论之后,我编辑我的答案以添加这一行 --> 如果 Option Strict 为 On 并且“For”以 0 或 1 或任何数字开头并且 txtKills[X] 存在,我的代码将不起作用。

这是我之前的回答,不知道要不要删:

您的代码工作正常,但我认为您有一个错误,因为您的 For 从 0 开始并且您没有任何“txtKills0”。我现在已经测试过了:

   Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Dim k_kills(10) As String '<< Ignore the length
        For i = 1 To 7
            Dim tempBox As TextBox
            Dim tempName As String = "txtKills" & i.ToString
            tempBox = Me.Controls.Item(tempName)

            k_kills(i) = tempBox.Text
            MsgBox(k_kills(i))
        Next

    End Sub
于 2019-12-12T18:00:19.330 回答