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

Signaler
Messages postés
8
Date d'inscription
vendredi 17 février 2006
Statut
Membre
Dernière intervention
17 février 2006
-
Messages postés
2375
Date d'inscription
jeudi 12 juillet 2001
Statut
Modérateur
Dernière intervention
15 décembre 2018
-
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

Messages postés
2375
Date d'inscription
jeudi 12 juillet 2001
Statut
Modérateur
Dernière intervention
15 décembre 2018
22
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
Messages postés
8
Date d'inscription
vendredi 17 février 2006
Statut
Membre
Dernière intervention
17 février 2006

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 +
Messages postés
2375
Date d'inscription
jeudi 12 juillet 2001
Statut
Modérateur
Dernière intervention
15 décembre 2018
22
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"
Messages postés
4172
Date d'inscription
mercredi 30 juillet 2003
Statut
Membre
Dernière intervention
9 juin 2006
27
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
Messages postés
8
Date d'inscription
vendredi 17 février 2006
Statut
Membre
Dernière intervention
17 février 2006

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+
Messages postés
2375
Date d'inscription
jeudi 12 juillet 2001
Statut
Modérateur
Dernière intervention
15 décembre 2018
22
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 !
Messages postés
8
Date d'inscription
vendredi 17 février 2006
Statut
Membre
Dernière intervention
17 février 2006

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
Messages postés
2375
Date d'inscription
jeudi 12 juillet 2001
Statut
Modérateur
Dernière intervention
15 décembre 2018
22
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
Messages postés
8
Date d'inscription
vendredi 17 février 2006
Statut
Membre
Dernière intervention
17 février 2006

Désolé j'ai répondu trop vite
Messages postés
8
Date d'inscription
vendredi 17 février 2006
Statut
Membre
Dernière intervention
17 février 2006

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
Messages postés
2375
Date d'inscription
jeudi 12 juillet 2001
Statut
Modérateur
Dernière intervention
15 décembre 2018
22
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"
Messages postés
8
Date d'inscription
vendredi 17 février 2006
Statut
Membre
Dernière intervention
17 février 2006

Merci Willi
Messages postés
2375
Date d'inscription
jeudi 12 juillet 2001
Statut
Modérateur
Dernière intervention
15 décembre 2018
22
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