VB.Net comment Acceder a un controle variable sans connaitre sa propriété index

ERM_ERM Messages postés 8 Date d'inscription vendredi 17 février 2006 Statut Membre Dernière intervention 17 février 2006 - 17 févr. 2006 à 15:47
cs_Willi Messages postés 2375 Date d'inscription jeudi 12 juillet 2001 Statut Modérateur Dernière intervention 15 décembre 2018 - 17 févr. 2006 à 19:11
Voila le probleme

je souhaite affecter une valeur à un controle sans connaitre sa valeur index (qui doit etre integer)

en vba la syntaxe suivante est possible

dim mavar = "NomControle"
controls(mavar).text = "valeur a attribuer"

en vb.net

cette syntaxe ne fonctionne pas car mavar n'est pas "integer"

Comment contourner le probleme

Merci a tous

13 réponses

cs_Willi Messages postés 2375 Date d'inscription jeudi 12 juillet 2001 Statut Modérateur Dernière intervention 15 décembre 2018 22
17 févr. 2006 à 16:03
Salut,
Si tu connais le nom de ton contrôle dont tu veux modifier son texte tu peux faire comme cela



For
Each
obj
As
Control
In

Me
.Controls

If obj.Name =
"NomDeTonControle"

Then

obj.Text =
"Nouveau texte"

Exit
For

End
If

Next


<HR width="100%" SIZE=2>
Si une réponse vous convient, cliquez sur le bouton "Réponse a
0
ERM_ERM Messages postés 8 Date d'inscription vendredi 17 février 2006 Statut Membre Dernière intervention 17 février 2006
17 févr. 2006 à 16:10
Willi,

je te remercie pour ta réponse,

j'y avait pensé mais faire ce traitement itératif sur chaque controle
va ralentir énormément le traitement

d'autant qu'il s'agit d'une opération qui sera faites tres souvent

j'ai également pensé créer une table de correspondance entre controls.index et controls.name

par le biais d'une fonction style "dictionnaire de valeur"

mais je ne sais pas si la propriété index de chaque controle est fixe ou si elle peut varier.

en tous cas merci de d'être intéressé a mon problème

A +
0
cs_Willi Messages postés 2375 Date d'inscription jeudi 12 juillet 2001 Statut Modérateur Dernière intervention 15 décembre 2018 22
17 févr. 2006 à 16:32
Tu as essayé ceci tout simplement.
Me.Controls("NomDeTonControle"
).Text =
"bouh"


<HR width="100%" SIZE=2>
Si une réponse vous convient, cliquez sur le bouton "Réponse acceptée"
0
crenaud76 Messages postés 4172 Date d'inscription mercredi 30 juillet 2003 Statut Membre Dernière intervention 9 juin 2006 29
17 févr. 2006 à 16:45
Willi < Me.Controls("NomDeTonControle").Text = "bouh" ne fonctionnera pas ! Controls.Item(...) attend effectivement un integer en tant qu'argument.
erm_erm< A priori les index des controles ne changeront pas ...sauf si tu les change volontairement toi-même. Il faudrait peutêtre faire un tour de For Each sur Controls pour obtenir l'index de chaque controle et l'associer au nom du controle dans un tableau, un dictionnaire ou une hastable

CR
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
ERM_ERM Messages postés 8 Date d'inscription vendredi 17 février 2006 Statut Membre Dernière intervention 17 février 2006
17 févr. 2006 à 16:57
Je crois effectivement que c'est ce que je vais faire

mais j'imaginais qu'il serait possible de créer une surcharge a controls(integer)
afin qu'il accepte comme index le nom du controle plutot que sa valeur index

en tous cas merci à tous pour toutes ces tentatives d'aide

A+
0
cs_Willi Messages postés 2375 Date d'inscription jeudi 12 juillet 2001 Statut Modérateur Dernière intervention 15 décembre 2018 22
17 févr. 2006 à 17:16
Crenaud76 en vb.net cela marche!
La propriété controle possède 2 signatures différentes

me.controls(int index)
me.controls(string name)

Je viens de vérifier et tester !
0
ERM_ERM Messages postés 8 Date d'inscription vendredi 17 février 2006 Statut Membre Dernière intervention 17 février 2006
17 févr. 2006 à 17:40
Merci Crenaud76

Moi ça ne marche pas


Me.Controls("tb23").Text = "Z"

j'ai le message d'erreur suivant ( uniquement a l'execution)
Cast de la chaine "tb23" en type integer non valide

si a la place de "tb23" je positionne une variable ayant un type different de integer
j'obtiens la même erreur

Par acquis de conscience j'ai aussi testé


a Me.Controls("tb23").Text> même erreur

Je suis quand même content que pour toi ça marche, cela veut dire qu'il y a une solution

peut être que dans le références tu dois avoir quelquechose de plus que moi
qui permet la surcharge de "controls" pour qu'il accepte comme index un "string name"

Moi j'ai :

System
System.data
System.Drawing
System.Windows.forms
System.xml

En tous cas merci de te creuser la tête et d'avoir testé

Précision : je travaille en vb.net 2003 et pas encore 2005
0
cs_Willi Messages postés 2375 Date d'inscription jeudi 12 juillet 2001 Statut Modérateur Dernière intervention 15 décembre 2018 22
17 févr. 2006 à 17:42
Crenaud76 => autant pour moi il n'y a qu'une signature c'est que j'utilise vb2005 j'ai pas tilté !
ERM_ERM => Utilise un dictionnaire dans ce cas que tu remplis dans ton form_load
0
ERM_ERM Messages postés 8 Date d'inscription vendredi 17 février 2006 Statut Membre Dernière intervention 17 février 2006
17 févr. 2006 à 17:42
Désolé j'ai répondu trop vite
0
ERM_ERM Messages postés 8 Date d'inscription vendredi 17 février 2006 Statut Membre Dernière intervention 17 février 2006
17 févr. 2006 à 18:25
Je Viens effectivement de vérifier sur MSDN2 et sur MSDN

Controls.Item() Sur VS 2003 est forcement integer

alors que sur vs 2005 les valaur (index integer) et (string Name) sont acceptées

Je vais donc me résoudre a utiliser un dictionnaire

ou a passer sur vs 2005 ????????

Merci encore à tous
0
cs_Willi Messages postés 2375 Date d'inscription jeudi 12 juillet 2001 Statut Modérateur Dernière intervention 15 décembre 2018 22
17 févr. 2006 à 18:52
En utilisant un dictionnaire sa donne ceci avec vb2005 après adapte le pour vb2003 mais je ne pense pas qu'il y ai grand chose à modifier

Voici un exemple (qui marche j'ai testé)



Dim dico
As
New Dictionary(
Of
String,
Integer)



Private
Sub Form1_Load(
ByVal sender
As System.Object,
ByVal e
As System.EventArgs)
Handles
MyBase.Load



'remplis le dico
Dim c
As
Integer = 0

For
Each obj
As Control
In
Me.Controls
dico.Add(obj.Name, c)
c += 1

Next



End
Sub

Private
Sub Button2_Click(
ByVal sender
As System.Object,
ByVal e
As System.EventArgs)
Handles Button2.Click



'change la valeur texte d'un objet appelé "CheckBox1"
Dim index
As
Integer = dico.Item(
"CheckBox1")

Me.Controls(index).Text =
"bouhhhhh"



End
Sub


<HR width="100%" SIZE=2>
Si une réponse vous convient, cliquez sur le bouton "Réponse acceptée"
0
ERM_ERM Messages postés 8 Date d'inscription vendredi 17 février 2006 Statut Membre Dernière intervention 17 février 2006
17 févr. 2006 à 19:03
Merci Willi
0
cs_Willi Messages postés 2375 Date d'inscription jeudi 12 juillet 2001 Statut Modérateur Dernière intervention 15 décembre 2018 22
17 févr. 2006 à 19:11
avec 2003 la déclaration du dico peut se faire comme ceci
Dim dico as new collections.hashtable

Après le reste ne change pas....
Voila
0