我正在尝试使用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
答案 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中自由更改样式,不同列的字体颜色。