2012-11-15 3 views
1

나는 이것을 짧고 달콤하게 유지하려고 노력할 것이다.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 

답변

1

, 각 매개 변수 개체를 유지하기 위해 텍스트 상자의 태그 속성을 사용할 수 있습니다 :

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

은 아이러니하게도 나는이 라인을 사용하고는, CurrentParameters.Item을하고있다 (0) .DataValue = ctl.text ... 내가이 시점에서 그 단지 객체 이후 정의 때까지 존재 나던 속성을 가정 실행시. – user1732364

+0

@ user1732364 작동 할 수는 있지만 매개 변수와 동기화되지 않는 컨트롤의 순서에 더 의존합니다. – LarsTech

관련 문제