Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vb.net 如何使用变量引用文本框?_Vb.net - Fatal编程技术网

Vb.net 如何使用变量引用文本框?

Vb.net 如何使用变量引用文本框?,vb.net,Vb.net,我对VisualBasic和编程都是新手,但我正在尝试制作一个统计计数器类的程序。我试图使用一个变量来引用一个文本框,例如k_kills(I)=txtKills(I).Text。但是,这不起作用,因此我尝试了以下方法: For i = 0 To 8 Dim tempBox As TextBox Dim tempName As String = "txtKills" & i.ToString tempBox = Me.

我对VisualBasic和编程都是新手,但我正在尝试制作一个统计计数器类的程序。我试图使用一个变量来引用一个文本框,例如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什么都不是”

有人能告诉我我是否能做到这一点吗


谢谢。

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

Dim tempBox As TextBox = DirectCast(Me.Controls.Find(tempName, False), TextBox)
Dim tempBox As TextBox = DirectCast(Me.Controls.Find(tempName, True), TextBox)
但是如果控件的父控件可能不是表单,那么您可以调用:

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

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

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

Dim tempBox As TextBox = DirectCast(Me.Controls.Find(tempName, False), TextBox)
Dim tempBox As TextBox = DirectCast(Me.Controls.Find(tempName, True), TextBox)
但是如果控件的父控件可能不是表单,那么您可以调用:

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

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

在Mary的评论之后,我编辑我的答案以添加这一行-->我的代码会这样做如果选项Strict处于启用状态,且“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
Private子按钮1\u单击(发送者作为对象,e作为事件参数)处理按钮1。单击

Dim k_kills(10)作为字符串“在Mary的评论之后,我编辑我的答案以添加这一行-->如果选项Strict处于启用状态,并且“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
Private子按钮1\u单击(发送者作为对象,e作为事件参数)处理按钮1。单击

Dim k_kills(10)作为字符串“假设控件都以父控件的形式出现,并且它们都以txtKills开头。。。 如果要将这些文本框作为一个组来执行多个操作,则可能需要构建一个文本框数组或列表

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

假设控件都以父控件的形式出现,并且都以txtKills开头。。。 如果要将这些文本框作为一个组来执行多个操作,则可能需要构建一个文本框数组或列表

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

姓名还是临时姓名?这是一个输入错误吗?要使用
Me.Controls.Item(Name)
,首先,您需要
Me.Controls.Add(txtBox)
输入错误当我在这里输入时,它实际上是tempName。很抱歉,您可能还需要使用
控件。查找
,因为txtbox可能不直接位于表单(me)上,或者其他名称或tempName?这是一个输入错误吗?要使用
Me.Controls.Item(Name)
,首先,您需要
Me.Controls.Add(txtBox)
输入错误当我在这里输入时,它实际上是tempName。抱歉,您可能还需要使用
控件。查找
,因为txtbox可能不会直接位于表单(me)上或任何我可以打开的选项。这是一个由两部分组成的过程。首先,对于当前项目-在解决方案资源管理器中双击“我的项目”。选择左边的Compile。在“选项严格”下拉列表中,选择“启用”。第二,对于未来的项目-进入工具菜单->选项->项目和解决方案->VB默认值。在“选项严格”下拉列表中,选择“启用”。这将在运行时将您从错误中解救出来。请启用“严格”选项。这是一个由两部分组成的过程。首先,对于当前项目-在解决方案资源管理器中双击“我的项目”。选择左边的Compile。在“选项严格”下拉列表中,选择“启用”。第二,对于未来的项目-进入工具菜单->选项->项目和解决方案->VB默认值。在“选项严格”下拉列表中,选择“启用”。这将使您在运行时免受错误的影响。控件的父级不是窗体的示例是GroupBox或Panel。控件的父级不是窗体的示例是GroupBox或Panel。您可以使用LINQ简化代码:
Dim Kills As IEnumerable(of TextBox)=Me.Controls.OfType(of TextBox)()Where(函数(txt)txt.Name.StartsWith(“txtKills”)
@David更正,但我不喜欢屏幕上的线条;-)您可以使用LINQ简化代码:
Dim Kills As IEnumerable(Of TextBox)=Me.Controls.OfType(Of TextBox)()Where(Function(txt)txt.Name.StartsWith(“txtKills”))
@David正确,但我不喜欢屏幕上的线条。;-)