2010-02-23 27 views
1

我正在使用選項卡式接口來維護Windows窗體應用程序。在表單中有3個綁定源(我們稱之爲BindingSource1,BindingSource2,BindingSource3)。我想對代碼進行優化,並要動態訪問的BindingSource是這樣的:如何從窗體中獲取特定的BindingSource?

objBindingSource = CTYPE(Me.Controls(「BindingSource的」 + SelectedBindingSourceID)的BindingSource)

我知道,它不能完成使用CType,因爲無法將控件轉換爲BindingSource。

關於如何完成此任何想法會很好。

感謝,

拉賈

回答

3

一個BindingSourceComponent,不是Control,所以它不是Controls收藏。然而,設計師創建一個私有​​場稱爲components舉行創建窗體上的所有組件,這樣你就可以通過現場訪問組件:

For Each c In components.Components 
    MessageBox.Show(c.ToString()) 
Next 

不幸的是,組件沒有一個名字,所以你會必須找到另一種方法來識別您的BindingSource ...例如,如果您知道每個BindingSource都綁定到DataTable,您可以檢查表的名稱。

Private Function GetBindingSource(ByVal tableName As String) As BindingSource 

    For Each c In components.Components 

     Dim bs As BindingSource = TryCast(c, BindingSource) 
     ' If the component is a BindingSource 
     If bs IsNot Nothing Then 

      Dim dt As DataTable = TryCast(bs.DataSource, DataTable) 
      ' If the DataSource is a DataTable 
      If dt IsNot Nothing Then 
       ' Check the table name against the parameter 
       If dt.TableName = tableName Then 
        ' Found it ! 
        Return bs 
       End If 
      End If 
     End If 
    Next 

    ' Oops, BindingSource not found 
    Return Nothing 

End Function 

編輯:SO語法高亮顯示似乎與VB麻煩......

+0

即使它是一個漫長的路線,它絕對值得探索....非常感謝你:-) – Raja 2010-02-24 12:45:43

+0

語法高亮顯示不識別VB,因爲問題沒有VB標記。我添加了HTML註釋:'<! - language:lang-vb - >'來解決它。請參閱:[Markdown help:代碼的語法高亮顯示](http://stackoverflow.com/editing-help#syntax-highlighting)。 – 2017-05-03 12:51:59

+0

在分配實際數據源之前,DataSource屬性具有一個由WinForms設計器分配的Type對象,該對象指定綁定對象的類型(而不是它們的集合的類型),當您使用對象綁定時。因此,您可以使用它來識別正確的綁定源。 – 2017-05-03 13:01:13

0

個人而言,如果只有三個BindingSources,爲什麼不通過集合訪問它們,而不是直接?如果只是爲了讓代碼能夠通過循環運行,我看不到太多好處。然而,如果這就是你想要做的,一種方法是在Form或UserControl的構造函數(InitializeComponents方法之外)中初始化BindingSources並手動將它們添加到Components集合中。這樣做將允許您爲Components集合中的BindingSource指定一個名稱作爲鍵。然後,您可以訪問他們像這樣:(原諒我的C#,我不是VB流利,但你會得到JIST)

BindingSource bs1 = new BindingSource(); 
BindingSource bs2 = new BindingSource(); 
BindingSource bs3 = new BindingSource(); 

// set properties on BindingSources.... 

// add BindingSources to componenents collection manually. 
// add a name key 
components.Add(bs1, "BindingSource1"); 
components.Add(bs2, "BindingSource2"); 
components.Add(bs3, "BindingSource3"); 

// access the BindingSource 
BindingSource bsSelected = components.Components["BindingSource" + SelectedBindingSourceID] as BindingSource; 
if (bsSelected == null) 
{ 
    throw new Exception("BindingSource" + 
         SelectedBindingSourceID + " doesn't exist"); 
} 

它不漂亮,但它可以幫助你。

相關問題