2014-12-24 68 views
1

我正在嘗試編寫一個通用的例程以在窗體加載時填充組合框。我從MySql獲取數據並填充組合框,但它不適用於groupbox內的任何組合框。嘗試傳遞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)如果數據源是數據庫,爲什麼不只是綁定CBO? 2)除此之外,因爲您希望數據進入SPECIFIC cbo,請編寫一個子文件以發佈通過DS/DT和CBO對象引用的數據。所有通過表單名稱和控件名稱查找控件都讓你感到困惑。 – Plutonix

+0

不確定當你只有1個表單時你爲什麼要這樣做?你只需要命名你的組合框並填寫它,它不管它是否在groupbox中。只是簡單的combobox1.items.add()/ combobox2.items.add()應該做 – Nocturnal

+0

我有幾種形式,我沒有想過綁定它,我很習慣只做簡單的舊SQL,我沒有想到那。我會研究它,因爲它是有道理的。 – Mike

回答

0

您正在處理2個不同的ControlCollections,因爲看起來您正在使用Windows窗體,所以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

This Works ...謝謝!!! – 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 

我會盡力的數據還綁定有人建議,我只是沒有想到這一點,但這次終於要工作,我討厭我的解決方法,我有一直在使用