1

私はこれを短くて甘いものにしようとします.

SQL クエリを実行するための UI を作成しています。クエリに使用されるパラメーターごとに、パラメーターごとにラベルとテキスト ボックスが生成され、コントロールがパネルに配置されます。この部分は正常に機能していますが、各コントロールをループして、各パラメーターのテキストボックスから値を取得する必要があります。したがって、クエリに 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 にクエリのパラメーターのリストがあります。次に、パネル上のコントロールをループし、見つかったテキストボックスごとに、パラメーター値を、現在見つかったテキストボックスコントロールテキストである必要があるこの行CurrentParameters.Item(0).DataValue = ""で指定された textbox.text に設定し ます。""

これを行う別の方法がある場合は、お気軽にアイデアをお寄せください。これが機能すると考えているのは、インデックスを使用してコントロールをパラメーターに一致させているにもかかわらず、各パラメーターに基づいてコントロールを作成するため、同期する必要があるためです。


次のコードは、パネル上にコントロールを生成するものです。.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
4

1 に答える 1

1

TextBoxes を作成するとき、TextBox の 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
于 2012-11-15T16:33:22.117 に答える