【问题标题】:How to retrieve value of found control on a panel for a winform?如何在winform面板上检索找到的控件的值?
【发布时间】:2012-11-04 07:09:46
【问题描述】:

我会尽量保持简短和甜蜜。

我正在制作一个 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

【问题讨论】:

    标签: vb.net winforms controls panels


    【解决方案1】:

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

    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 这可以工作,但它确实更多地依赖于控件的顺序不会与您的参数不同步。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-24
    • 2022-08-15
    相关资源
    最近更新 更多