私はこれを短くて甘いものにしようとします.
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