从动态创建的文本框中读取数据

时间:2018-10-03 19:28:00

标签: vb.net winforms

我正在尝试使用vb.net创建动态文本框后收集数据

Private Sub btn_OK_lines_number_Click(sender As Object, e As EventArgs) 
    Handles btn_OK_lines_number.Click
    Dim i As Integer
    Dim x As Integer
    Dim Z As Integer
    Z = 150
    If IsNumeric(txt_lines_number.Text) Then
        Int32.TryParse(txt_lines_number.Text, x)
        For i = 1 To x
            Dim newTB As New TextBox
            Dim newLB As New Label
            newLB.Name = "lbl_workstation_number_line" & i
            newLB.Text = "Nbr Work Station in Line" & i
            newLB.Size = New Size(190, 20)
            newLB.ForeColor = Color.White
            newLB.Font = New Font("consolas", 12, FontStyle.Regular, GraphicsUnit.Pixel)
            newLB.Location = New Point(20, Z + i * 30)
            newTB.Name = "Textbox" & i
            newTB.Size = New Size(170, 20)
            newTB.Location = New Point(200, Z + i * 30)
            Me.Controls.Add(newTB)
            Me.Controls.Add(newLB)
        Next
        i = i + 1
    Else
        MessageBox.Show("please enter a number")
        txt_lines_number.Text = ""
    End If
End Sub

3 个答案:

答案 0 :(得分:2)

假设您只有一行,并且仅创建一个TextBox。您在这里设置名称:

Textbox1

其中生成的文本框被命名为Textbox1。问题是您不能像在txt_lines_number中那样直接在代码中直接引用标识符Me.Textbox1。您甚至不能将其引用为类(Dim)的成员。该名称在编译时不存在,因此它不是您可以使用的标识符,也不是该类的成员。该名称从来没有匹配的Controls语句。

但是,您可以做的是再次查看Me.Controls("Textbox1") 集合中的情况,在该集合中您将TextBox添加到了表单中:

Me.Controls("Textbox1").Text

Dim box As TextBox = DirectCast(Me.Controls("Textbox1"), TextBox)
MessageBox.Show(box.Text)    

您可能还需要将值强制转换为TextBox:

array = ["@user1","@User2","@uSer3","@User4"]

请记住,这里的情况很重要。

将其进一步保存在数据库中超出了一个问题的范围。这样做的方式与世界上的程序员一样多。您应该先尝试一下,然后在遇到特定问题时再提出一个新问题。

答案 1 :(得分:0)

谢谢你, 这是我的尝试,已经完成!

Dim userInput As TextBox = Form1.Controls.Item("TextBox" & i.ToString)
mycommand.Parameters.AddWithValue("@workstation", userInput.Text)

:D

答案 2 :(得分:0)

由于您创建了数量动态的输入控件,因此作业的正确工具将是DataGridView控件。

创建一个代表您的数据的类

Public Class LineInfo
    Public Property Number As Integer
    Public Property WorkStationNumber As Integer
End Class

在表单设计器中创建`DataGridView。

Private Sub btn_OK_lines_number_Click(sender As Object, e As EventArgs) Handles btn_OK_lines_number.Click
    Dim linesAmount As Integer
    If Integer.TryParse(txt_lines_number.Text, linesAmount) = False Then
        MessageBox.Show("please enter a number")
        txt_lines_number.Text = ""
        Exit Sub
    End If

    ' Create class instance for every line
    Dim lines = 
        Enumerable.Range(1, linesAmount)
                  .Select(Function(i) New LineInfo With { .Number = i })
                  .ToList()

    'Set lines as DataSource to the DataGridView
    Me.DataGridView1.DataSource = lines
End Sub

DataGridView将显示所有行并提供输入字段以更新工作站编号。

稍后您可以通过将DataSource投射回List

来访问更新的行
Dim lines = DirectCast(Me.DataGridView1.DataSource, List(Of LineInfo))

' Now you can access all data and save it to the database
Dim parameters = 
    lines.Select(Function(line)
                     Return new SqlParameter With 
                     {
                         .ParameterName = $"@workstation{line.Number}",
                         .SqlDbType = SqlDbType.Int,
                         .Value = line.WorkStationNumber
                     }
                 End Function)
         .ToList()

myCommand.Parameters.AddRange(parameters)

您可以在datagridview中自由更改样式,不同列的字体颜色。