我会尽量保持简短和甜蜜。
我正在制作一个 UI 来运行 sql 查询,对于用于查询的每个参数,它会为每个参数生成一个标签和一个文本框,并将控件放在面板上。我让这部分正常工作,但现在我需要遍历每个控件并从文本框中为每个参数提取值。因此,如果查询有 2 个参数,它会在面板上生成 2 个标签和 2 个文本框控件。然后我遍历面板上的控件并从每个控件中提取 textbox.text。问题是我找不到如何从文本框控件获取文本来设置每个参数的值来运行查询。
Dim CurrentParameters As New List(Of ParameterDT)
CurrentParameters = BCWorkerParam.GetData(cboQueries.SelectedValue)
For Each ctl In pnlParameters.Controls
If TypeOf ctl Is TextBox Then
If CurrentParameters.Count > 0 Then
CurrentParameters.Item(0).DataValue = ""
End If
End If
Next
这里的想法是,我在 CurrentParameters 中有查询的参数列表。然后,我遍历面板上的控件,对于找到的每个文本框,我将参数值设置为该行所述的 textbox.text,
CurrentParameters.Item(0).DataValue = ""
其中""
需要是当前找到的文本框控件文本。
如果还有其他方法可以做到这一点,请随时向我提出这些想法。我认为这会起作用是因为即使我使用索引将控件与参数匹配,它也会根据每个参数创建控件,因此它们应该是同步的。
好吧,我给出建议,下面的代码是在面板上生成控件的内容。我添加了 .Tag 部分,其余部分与上述相同。
'Generate query parameters
Dim CurrentTopPosition As Integer = 10
For Each param In Parameters
pnlParameters.AutoSize = True
Dim lblParam As New Label
lblParam.Text = param.DisplayName
lblParam.TextAlign = ContentAlignment.MiddleRight
lblParam.Top = CurrentTopPosition
lblParam.Left = 5
lblParam.Width = 100
pnlParameters.Controls.Add(lblParam)
Dim ctlParam As New Object
Select Case param.DataType
Case "String"
ctlParam = New TextBox
ctlParam.tag = param
Case "DateTime"
ctlParam = New DateTimePicker
ctlParam.tag = param
Case "Integer"
ctlParam = New TextBox
ctlParam.tag = param
Case "Double"
ctlParam = New TextBox
ctlParam.tag = param
End Select
ctlParam.Top = CurrentTopPosition
ctlParam.Left = 110
ctlParam.Width = 150
ctlParam.Tag = param
pnlParameters.Controls.Add(ctlParam)
CurrentTopPosition += 30
Next
现在,一旦生成了这些控件,我将遍历它们并执行此代码以执行查询。
Dim CurrentParameters As New List(Of ParameterDT)
CurrentParameters = BCWorkerParam.GetData(cboQueries.SelectedValue)
Dim index As Integer = 0
For Each ctl In pnlParameters.Controls
If TypeOf ctl Is TextBox Then
DirectCast(ctl.Tag, ParameterDT).DataValue = ctl.Text
'CurrentParameters.Item(index).DataValue = ctl.text
'index += 1
End If
Next