Vb.net 如何检索winform面板上找到的控件的值?

Vb.net 如何检索winform面板上找到的控件的值?,vb.net,winforms,controls,panels,Vb.net,Winforms,Controls,Panels,我会尽量保持简短和甜蜜 我正在制作一个UI来运行sql查询,对于用于查询的每个参数,它会为每个参数生成一个标签和一个文本框,并将控件放置在面板上。我让这个部分正常工作,但现在我需要遍历每个控件,并从文本框中提取每个参数的值。因此,如果一个查询有两个参数,它会在面板上生成两个标签和两个文本框控件。然后我在面板上的控件中循环,并从每个控件中拉出textbox.text。问题是我找不到如何从textbox控件获取文本来设置每个参数的值以运行查询 Dim CurrentParameter

我会尽量保持简短和甜蜜

我正在制作一个UI来运行sql查询,对于用于查询的每个参数,它会为每个参数生成一个标签和一个文本框,并将控件放置在面板上。我让这个部分正常工作,但现在我需要遍历每个控件,并从文本框中提取每个参数的值。因此,如果一个查询有两个参数,它会在面板上生成两个标签和两个文本框控件。然后我在面板上的控件中循环,并从每个控件中拉出textbox.text。问题是我找不到如何从textbox控件获取文本来设置每个参数的值以运行查询

        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
        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
这里的想法是,我在CurrentParameters中列出了查询的参数列表。然后我在面板上的控件中循环,对于找到的每个textbox,我将参数值设置为这一行所述的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)

    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
        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

创建文本框时,可以使用文本框的标记属性保存每个参数对象:

For Each p As ParameterDT In BCWorkerParam.GetData(cboQueries.SelectedValue)
  Dim txtBox As New TextBox()
  txtBox.Properties = yada-yada-yada
  txtBox.Tag = p
  pnlParameters.Controls.Add(txtBox)
Next
然后,当您需要读取这些值时,可以尝试以下方法:

For Each txtBox As TextBox In pnlParameters.Controls.OfType(Of Textbox)()
  DirectCast(txtBox.Tag, ParameterDT).DataValue = txtBox.Text
Next

创建文本框时,可以使用文本框的标记属性保存每个参数对象:

For Each p As ParameterDT In BCWorkerParam.GetData(cboQueries.SelectedValue)
  Dim txtBox As New TextBox()
  txtBox.Properties = yada-yada-yada
  txtBox.Tag = p
  pnlParameters.Controls.Add(txtBox)
Next
然后,当您需要读取这些值时,可以尝试以下方法:

For Each txtBox As TextBox In pnlParameters.Controls.OfType(Of Textbox)()
  DirectCast(txtBox.Tag, ParameterDT).DataValue = txtBox.Text
Next

具有讽刺意味的是,我使用了这一行,它正在工作,CurrentParameters.Item(0).DataValue=ctl.text。。。我假设,因为此时它只是一个对象,所以该属性在执行时定义之前不存在。@user1732364可以工作,但它更多地依赖于控件的顺序,而不是与参数不同步。具有讽刺意味的是,我使用了这一行,它正在工作,CurrentParameters.Item(0)。DataValue=ctl.text。。。我假设,因为此时它只是一个对象,所以在执行时定义属性之前,属性不存在。@user1732364可以工作,但它更多地依赖于控件的顺序,而不是与参数不同步。