나는 이것을 짧고 달콤하게 유지하려고 노력할 것이다.winform에 대해 패널에서 발견 된 컨트롤의 값을 검색하는 방법은 무엇입니까?
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에서 쿼리에 대한 매개 변수 목록이 있습니다. 그런 다음 패널의 컨트롤을 반복하고 발견 된 각 텍스트 상자에 대해이 줄에 표시된 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
이제 이러한 컨트롤이 생성되면 루프를 통해 루프를 실행하고 쿼리 실행을 위해이 코드를 수행합니다. 당신이 값을 읽을 필요가있을 때 당신은 이런 식으로 뭔가를 시도 할 수 있습니다, 그리고
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
: 당신이 당신의 텍스트 상자를 만들 때
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.Item을하고있다 (0) .DataValue = ctl.text ... 내가이 시점에서 그 단지 객체 이후 정의 때까지 존재 나던 속성을 가정 실행시. – user1732364
@ user1732364 작동 할 수는 있지만 매개 변수와 동기화되지 않는 컨트롤의 순서에 더 의존합니다. – LarsTech