accès à plusieurs contrôles de formulaire à l'aide d'une variable pour le nom
Je suis en train de parcourir un groupe de zones de liste modifiables et définir une propriété à l'aide d'une chaîne concaténée & variable pour représenter le nom de la commande. Cependant, je ne peux pas obtenir l'instance de la forme à reconnaître l' (String & Integer_Variable) comme l'une de ses commandes -- et donc il ne reconnaît pas toutes les propriétés des sous-routines ou en tant que membres du Système.De Windows.Les formulaires.De contrôle.
J'ai trouvé le DirectCast solution DONC et il semble fonctionner (même si je suis douteuse), mais qui se sent comme une très maladroit solution. Est-il une manière plus propre de faire cela?
For myTempCount = 1 To 6
If tempValue < Me.("ComboBox" & myTempCount).Items.Count Then
ComboBox.SelectedIndex = tempValue 'appears to work -- how?
Me.ComboBox.SelectedIndex = tempValue 'appears to work
Me.("ComboBox" & myTempCount).SelectedIndex = tempValue 'doesn't work
Me.Controls.("ComboBox" & myTempCount).SelectedIndex = tempValue 'doesn't work
DirectCast(Me.Controls.Find(("ComboBox" & myTempCount), True)(0), ComboBox).SelectedIndex = tempValue 'appears to work
DirectCast(Me.Controls("ComboBox" & myTempCount), ComboBox).SelectedIndex = tempValue 'appears to work
Next
Ce code a été à l'origine de VBA /VB6, que j'ai mis par ArtinSoft de Mise à niveau Visual Basic Compagnon (VBUC). FWIW, je suis à l'aide de Microsoft Visual Basic 2010 Express.
Vous devez vous connecter pour publier un commentaire.
Pour répondre à vos questions:
ComboBox1.SelectedIndex
fonctionne parce que ComboBox1 est le contrôle qui est présent dans le Formulaire de ControlCollectionMe.ComboBoxPrinter1.SelectedIndex
fonctionne parce que Moi, c'est une référence à la classe d'un il fait référence au Contrôle.Me.("ComboBoxPrinter" & myTempCount).SelectedIndex
ne fonctionne pas, car la chaîne deComboBoxPrinter & myTempCount
est une chaîne non un Contrôle.Me.Controls.("ComboBoxPrinter" & myTempCount).SelectedIndex
ne fonctionne pas pour les mêmes raisons.Personnellement, j'utilise habituellement CType autres que DirectCast. La principale différence selon cette lien entre CType et DirectCast est que DirectCast doit être le Type exact où que CType peut être utilisé dans le rétrécissement ou l'élargissement des Conversions. DirectCast est plus effiecent quoique les plus tatillons.
Cela étant dit, vous pourriez faire quelque chose comme ceci:
Je ne suis pas à l'aide de Moi en face de Commandes car il se réfère à la même collection, si vos contrôles dans une autre collection, vous aurez besoin d'utiliser ce Contenant à la place. c'est à dire si vous étiez à l'aide d'un Panneau de
Panel1.Controls.ContainsKey
Ouch!!! J'ai foiré Directe de la Fonte à la fois. J'en ai un souvenir d'un cauchemar. Ma préférence est de coller avec le côté serveur contrôles, ou les écrire en tant côté client Javascript/Ajax. Où dans votre code ci-dessus est-elle défaillante? Tout exceptions internes?
Peut-être que vous pouvez essayer quelque chose comme ceci (C#):
Voici le code ci-dessus converti à VB.NET à l'aide d'un outil en ligne:
J'espère que cela aide!
Je suis tombé sur cette question à nouveau avec de multiples contrôles de types différents qui doivent bénéficier de la même opération effectuée sur une propriété commune (comme
.Text
). Puisque vous ne pouvez pas utiliser une variable pour représenter le type de contrôle de paramètre dansCType()
, vous aurez à utiliser un conditionnel et un correspondant codé en durCType()
commande pour obtenir le contrôle. C'est ce que je suis venu avec:controlName
est la concaténation de chaîne de nom. Ainsi, vous pouvez utiliser cette Fonction peu de la même manière les réponses précédentes utiliséCType()
:Quelque chose comme ceci: