2010-02-23 4 views
1

Je travaille sur une application de formulaires de maintenance Windows avec interface à onglets. Dans le formulaire il y a 3 sources de liaison (appelons-le BindingSource1, BindingSource2, BindingSource3). Je suis en train d'optimiser le code et que vous voulez accéder dynamiquement quelque chose BindingSource comme ceci:Comment obtenir une BindingSource spécifique à partir d'un formulaire Windows?

objBindingSource = Ctype (Me.Controls ("BindingSource" + SelectedBindingSourceID), BindingSource)

Je sais que ce ne peut être accompli en utilisant CType car un contrôle ne peut pas être converti en BindingSource.

Toute idée sur la façon d'accomplir cela serait géniale.

Merci,

Raja

Répondre

3

A BindingSource est un Component, pas Control, il est donc pas dans la collection Controls. Cependant, le concepteur crée un champ IContainer privé appelé components de tenir tous les composants créés sur la forme, afin que vous puissiez accéder aux composants dans ce domaine:

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

Malheureusement, les composants n'ont pas un nom, de sorte que vous doit trouver un autre moyen d'identifier votre BindingSource ... Par exemple, si vous savez que chaque BindingSource est lié à un DataTable, vous pouvez vérifier le nom de la table.

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 

EDIT: la syntaxe surligneur SO semble avoir du mal avec VB ...

+0

Même si c'est un long chemin, il vaut vraiment la peine d'explorer .... Merci beaucoup :-) – Raja

+0

La syntaxe surligneur n'a pas reconnu VB, parce que la question n'a pas de balise VB. J'ai ajouté des commentaires HTML: '' pour le réparer. Voir: [Markdown help: Mise en évidence de la syntaxe pour le code] (http://stackoverflow.com/editing-help#syntax-highlighting). –

+0

Avant qu'une source de données réelle soit affectée, la propriété 'DataSource' a un objet' Type' assigné par le concepteur WinForms, qui désigne le type des objets liés (pas le type de leur collection), lorsque vous utilisez la liaison d'objet. Ainsi, vous pouvez l'utiliser pour identifier la bonne source de liaison. –

0

Personnellement, s'il n'y a que trois BindingSources, pourquoi ne pas y accéder directement au lieu juste de via une collection? Si c'est juste pour améliorer le code afin de pouvoir l'exécuter en boucle, je ne vois pas beaucoup d'avantages. Cependant, si c'est ce que vous voulez faire, une façon de le faire serait d'initialiser BindingSources dans le constructeur de Form ou UserControl (en dehors de la méthode InitializeComponents) et de les ajouter manuellement à la collection Components. En procédant ainsi, vous pourrez attribuer un nom en tant que clé à BindingSource dans la collection Components. Vous pouvez alors y accéder comme ceci: (pardonnez mon C#, je ne suis pas couramment VB, mais vous obtiendrez le 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"); 
} 

Ce n'est pas assez, mais il peut vous aider.

Questions connexes