2010-09-15 3 views
0

Je cours un Sub qui prend comme arguments un Datatable et un String.Comment faire pour exécuter une chaîne en tant que commande dans Visual Basic (VB.NET)

Private Sub Populate(ByVal dttemp As DataTable, ByVal strWhichPart As String) 

À un moment donné, il existe une zone de liste déroulante qui contient certaines des données dans le datatable. Le nom de la zone de liste déroulante est cmd plus le nom de la chaîne par exemple lorsque la chaîne est Person_FirstName le nom de la zone de liste déroulante est cmbPerson_FirstName. Puis-je ajouter des éléments à la combobox comme ceci:

cmbPerson_FirstName.Items.Add(strHold(rr)) 

Ma question est peut-je faire une chaîne dans une commande? Parce que j'ai beaucoup comboboxes qui ont le même nom que l'argument de chaîne de la sous comment puis-je faire quelque chose comme cela fonctionne

strWhichPart.Items.Add(strHold(rr)) 

dans lequel strWhichPart est une chaîne. Y at-il une commande que je peux exécuter une chaîne en tant que commande? Merci.

+0

Astuce: http://www.catb.org/~esr/faqs/smart-questions.html#goal – Rushyo

Répondre

1

Si je comprends bien, il suffit de prendre le contrôle correct de la collection Controls du formulaire en utilisant la chaîne comme la clé:

CType(Controls(strWhichPart), ComboBox).Items.Add(strHold(rr)) 
+0

Avec une légère modification, il a travaillé. Merci beaucoup CType (Contrôles ("cmb" + strWhichPart), ComboBox) .Items.Add (strHold (rr)) –

+0

N'oubliez pas de sélectionner ceci comme votre réponse choisie! – Rushyo

1

Vous pouvez utiliser la réflexion pour y parvenir en créant un assemblage avec le code dans une méthode , mais ce n'est vraiment pas recommandé. Comme dans, c'est fou. Je suppose qu'il n'y a pas de problèmes dans le développement .NET qui ont besoin de cette approche. Plutôt que d'utiliser cette approche, passez la zone de liste déroulante appropriée en tant qu'argument et non en tant que chaîne arbitraire. Les listes déroulantes sont des objets comme n'importe quoi d'autre. Vous pouvez créer un dictionnaire qui vous permet de rechercher des listes déroulantes par une chaîne. Quelque chose comme:

Dictionary(Of String, ComboBox) MyDictionary = new Dictionary(Of String, ComboBox)() 
MyDictionary.Add("ComboBoxA", objComboBoxA) 
ComboBox objTheComboBox = MyDictionary("ComboBoxA") 

Le nom que vous donnez vos objets ne doit pas être sémantiquement pertinent dans votre code. Si je nomme un objet "lstMyObjectNamedThisWayForAReason1", je ne devrais PAS l'utiliser pour le référencer. Au lieu de cela, il devrait y avoir une séparation entre ce qui constitue un élément de GUI et comment il est référencé. Par exemple, si je crée une interface graphique WinForms et que je référence directement tous les éléments, je dois ensuite écrire une autre interface en utilisant une structure différente pour réécrire chaque référence. Ce n'est pas un problème si vous ne liez pas votre logique directement dans vos contrôles. La seule raison pour les relier est la paresse et le manque de respect pour les collègues qui pourraient devoir améliorer votre code à l'avenir. Pourquoi devraient-ils se soucier de ce à quoi ressemble l'interface graphique? Ils pourraient même ne pas utiliser Visual Studio! Ils ne peuvent certainement pas prendre votre code et l'utiliser ailleurs sans déchirer votre dépendance à l'interface graphique.

+1

Vous pouvez utiliser la propriété 'Collections' pour éviter d'avoir à créer le' Dictionary'. Aussi, je dirais que votre réponse est un peu agressive, d'autant plus que vous ne savez pas ce qu'il développe, son approche pourrait parfaitement convenir à son cas (par exemple une petite application qui n'est qu'une interface pour certaines tables DB). –

+0

En effet. C'était juste un échantillon.En ce qui concerne l'approche, même si c'est un cas simple, cela n'en fait pas une bonne pratique. Fait juste une mauvaise pratique que personne ne va (probablement) choisir. Pour la quantité de fois mon «prototype de base» a fini par être transformé en application finale contre ma volonté ... – Rushyo

1

Avec une modification mineure de ho1 cela a fonctionné. Merci beaucoup

CType(Controls("cmb" + strWhichPart), ComboBox).Items.Add(strHold(rr)) 
Questions connexes