2014-12-24 7 views
1

양식이로드 될 때 콤보 상자를 채우기 위해 일반 루틴을 작성하려고합니다. MySql에서 데이터를 가져 와서 콤보 상자를 채우지 만 그룹 상자 안의 콤보 박스에서는 작동하지 않습니다. formname, groupbox 이름, comboname byVal 및 byRef로 전달하려고 시도한 객체, 문자열, 컨트롤로 전달하여 다양한 ctypes 및 trycast를 시도했지만 마법 구문을 찾을 수없는 것 같습니다. 나는 2 개의 콤보 박스가있는 테스트 폼을 가지고있다. 하나는 외부이고 하나는 그룹 박스와이 코드이다.콤보 상자가 그룹 상자에있을 때 vbnet에서 콤보 상자 채우기

Public Function TESTloadComboBoxOrHelp(ByRef formName As Form, ByVal boxName As Object, ByVal callingName As String) ', ByVal groupBx) 
    'loadComboBoxOrHelp(me,"comboboxname",me.name) 
    'tried passing byVal and byRef, no difference 
    'frmCmbTest has 2 combo boxes, one in a groupbox and one not in groupbox, the one NOT in works 
    ' 
    If formName.Name.ToString = "frmCmbTest" Then 
     CType(formName.Controls(boxName), ComboBox).Items.Add("ABC") ' 1: this WORKS because combobox1 is NOT in a groupbox BUT does not work for combobox2 in groupbox 
     frmCmbTest.ComboBox2.Items.Add("ZYZ") ' 2: NOT Generic, this WORKS even though combobox2 is in a groupbox so why does line 1: above NOT work for a groupbox ? 
     'formName.boxName.Items.Add("ZYZ") ' 2.1: this does NOT work even though its the equivalent syntax (didn't expect it to) 
     'formName.groupBx.boxName.Items.Add("ZYZ") ' 2.2: NOPE, Tried passing in the name of the groupbox 
     'frmCmbTest.CType(formName.controls("Groupbox1"), GroupBox),CType(formName.Controls.boxName.Name.ToString), ComboBox).Items.Add("DEF") ' 3: so of course this should not work, tried to replicate line above (2:) could not figure out syntax that would work. 
     'frmCmbTest.GroupBox1.ComboBox2.Items.Add("ZYZ") ' 4: does not work, as is expected not to. 
     'TryCast(formName."GroupBox1".Controls(boxName.Name), ComboBox).Items.Add("MNO") '5: I am guessing I need to add the groupbox name somewhere 
     TryCast(formName.Controls(boxName), ComboBox).Items.Add("MNO") ' 6: out of ideas, works for combobox1 not in groupbox, does not work for combobox2 in groupbox1 
    End If 
    Return 1 
End Function 

현재 나는 5 개 기능, 다양한 형태의 groupboxes에없는 콤보를 작성을위한 하나의 일반적인 하나는 일반적이고 그 날 운전 미친하지 않은 4 개 기능을 가지고 있습니다.

+1

당신은 너무 복잡하게 만들고있다. 1) 데이터 소스가 DB 인 경우 CBO를 바인드하지 않는 이유는 무엇입니까? 2) 데이터가 특정 cbo에 들어가기를 원하므로 DS/DT 및 CBO 객체 참조를 전달하는 데이터를 게시하는 하위를 작성하십시오. formname과 control name에 의한 모든 찾기 제어는 당신을 혼란스럽게합니다. – Plutonix

+0

왜 1 개의 양식 만 가지고있을 때 이것을하고 있는지 확실하지 않습니까? 당신은 당신의 콤보 박스를 이름 짓고 그것을 채울 수 있습니다. 그것이 그룹 박스에 있다면 상관 없습니다. 그냥 평범한 combobox1.items.add()/combobox2.items.add()해야합니까 – Nocturnal

+0

나는 여러 가지 양식을 가지고 있고 그것을 바인딩 생각하지 않았어, 나는 너무 생각을하지 않은 일반 오래된 SQL을하는 데 사용되는 그. 그것이 의미가 있기 때문에 나는 그것을 조사 할 것이다. – Mike

답변

0

ControlCollections은 Windows Forms를 사용하고있는 것으로 보이므로 Control Colllection에는 해당 항목이 상위 컬렉션과 해당 하위 항목에 있는지 확인하는 Find 메서드가 있습니다. 모든 일치 항목의 배열을 반환하므로 장치 이름이 고유하고 서로의 하위 집합이 아닌지 확인하십시오. 즉 boxName 및 boxName1가주고 당신에게로 boxName 2 개 항목 그의 대답이 작동 위의 표에 내 의견에 따라

Dim c As Control() = Controls.Find("boxName", True) 'Search for boxName in parent and all child controls 
If c.Count > 0 Then         'Check to see if we got a match 
    CType(c(0), ComboBox).Items.Add("ABC") 
End If 
+0

이것은 작동합니다 ... 감사합니다 !!! – Mike

+0

귀하의 도움을 기쁘게 생각합니다. –

0

과 결과를 검색! 이 (나중에 참조) 나는 결국 무엇

Public Function TESTloadComboBoxOrHelp(ByRef formName As Form, ByVal boxName As Object, ByVal callingName As String) ', ByVal groupBx) 
    'loadComboBoxOrHelp(me,"comboboxname",me.name) 
    ' 
    Dim c As Control() = formName.Controls.Find(boxName, True) 'Search for boxName in parent and all child controls 
    If c.Count > 0 Then         'Check to see if we got a match 
     Try 
      conn.Open() 
      myCommand.Connection = conn 
      Dim query = "SELECT name, lookupValue " _ 
        & "FROM lookups " _ 
        & "WHERE name = '" & formName.Name.ToString & "." & boxName.ToString & "'" 
      myCommand.CommandText = query 
      If debug Then evl.WriteToSimpleLog(query, callingName) 
      myReader = myCommand.ExecuteReader() 
      While myReader.Read 
       CType(c(0), ComboBox).Items.Add(myReader.GetString("lookupValue").ToString) 
      End While 
     Catch ex As Exception 
      MessageBox.Show("Error while retrieving records on table Lookups..." & ex.Message, "Lookups Table") 
     Finally 
      If conn.State = ConnectionState.Open Then conn.Close() 
     End Try 
    End If 

나는, 나는 내가 가진 내 해결 방법을 싫어, 나는 그냥 생각하지 않았다 제안했지만,이 마지막으로 작동하고 또한 데이터 바인딩을 다할 것입니다 사용하고있다

관련 문제