Menu

Adressage indexé d'un control [Résolu]

Messages postés
20
Date d'inscription
jeudi 7 février 2019
Dernière intervention
18 février 2019
- - Dernière réponse : Whismeril
Messages postés
12755
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
19 février 2019
- 8 févr. 2019 à 16:10
Bonjour

La ligne ci-dessous adresse un Control nommé TextBoxTxbArduino5Text appartenant à un Crontol Utilisateur nommé cuArduino170 instancié dans un Form nommé FoCE
J'ai 10 Controle Utilsateur jusqu'à cuArduino179

GD.FoCE.cuArduino170.TextBoxTxbArduino5Text = Convert.ToString(compteur);

je souhaiterais pouvoir adresser mon Control en usant d'un String
String NumArd ="cuArduino" + i ; // où i est égale à "170"
pour un syntaxe comme celles-ci fausses bien sur, d'ou ma question

GD.FoCE.Controls(NumArd).TextBoxTxbArduino5Text = Convert.ToString(compteur);
ou
GD.FoCE.Controls("cuArduino" + i).TextBoxTxbArduino5Text = Convert.ToString(compteur);

Merci de votre aide
Afficher la suite 

Votre réponse

3 réponses

Meilleure réponse
Messages postés
12755
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
19 février 2019
466
1
Merci
Bonjour
Je tappe de tête, ça n.est peut-être pas rigoureusement exact:

GD.FoCE.Controls.OffType<TextBox>.Single(x => x.Name == "cuArduino" + i).TextBoxTxbArduino5Text = Convert.ToString(compteur);  

Je ne suis pas certain que la clause OffType soit nécessaire car de mémoire la classe contrôle possède déjà la propriété Name.
A essayer avec ou sans.

Par contre, ce que tu fais est contraire au principe même d’un objet (et C# est un langage objet, pas seulement orienté objet).
Un objet (graphique ou non) encapsule d’autres objets, les objets encapsulés sont privés de façon à garantir le fonctionnement de l’objet.
C’est à l’objet encapsleur que l’extérieur parle, c’est lui qui se charge de parler à ses composants.

En l’état, rien ne m’empêche d’écrire « Maman » dans ce textBox, mais si tu fais des calculs derrière qui attendent un entier (je suppose que compteur est un entier) alors ça va planter.

Si tu remets ton textBox privé, comme il aurait dû rester, et que tu crées une propriété de type int.
C’est à cette propriété que tu affectes compteur, et dans le code de cette propriété, on affecte le textbox et éventuellement une variable locale (pour faire tes calculs).
Dans ce cas l’extérieur ne peut plus affecter « Mamam », le compilateur l’interdira et le fonctionnement de ton contrôle est garanti.

Un autre point C# est pensé pour répondre au pattern MVC, oú le contrôle ne contient pas la donnée, il sert à la transmission bidirectionnelle entre la source de données et l’utilisateur.
Utliser le TextBox pour faire des calculs, va à l’encontre de ce pattern.
Utiliser variable locale bindée avec le Textbox répond à ce pattern.

Ce ne sont que des conseils, c’est pas obligatoire, mais C# est optimisé pour fonctionner ainsi.

PS pour poster du code, lisible, merci de lire de d’appliquer ce qui est décrit là https://codes-sources.commentcamarche.net/faq/11288-les-balises-de-code

Dire « Merci » 1

Heureux de vous avoir aidé ! Vous nous appréciez ? Donnez votre avis sur nous ! Evaluez CommentCaMarche

CCM 57473 internautes nous ont dit merci ce mois-ci

Commenter la réponse de Whismeril
Messages postés
12755
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
19 février 2019
466
1
Merci
Ha la collection Contols n’est peut-être pas « linquable », dans ce cas, il faut faire un foreach et tester la propriété Name.

si tant est que j'assimile les concepts que tu évoques car je suis un autodidacte venu du vieux monde des automatismes et du VBA

Des cours et des tutos sur la programmation objet, il y en a plein sur le net dont le mien.
Je ne prétends pas être meilleur que les autres (loin de là) mais je l’ai écrit pour C# et en tant qu’autodidacte.
https://codes-sources.commentcamarche.net/faq/11239-la-programmation-objet-appliquee-a-net-par-l-exemple-partie-1-sur-3

Dire « Merci » 1

Heureux de vous avoir aidé ! Vous nous appréciez ? Donnez votre avis sur nous ! Evaluez CommentCaMarche

CCM 57473 internautes nous ont dit merci ce mois-ci

Whismeril
Messages postés
12755
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
19 février 2019
466 -
Ps pour la coloration syntaxique, tu n’as pas imposé la.coloration csharp, du coup ça fait un pavé tout gris
robunccm
Messages postés
20
Date d'inscription
jeudi 7 février 2019
Dernière intervention
18 février 2019
-
de quel pavé gris parles-tu ? chez moi tout est lisible correctement
où trouver le réglage dont tu parles ?

merci pour le lien je vais m'y atteler pour progresser en C#

dire qu'en VB ceci fonctionne très bien, mais bon il est sans doute impossible d'avoir le meilleur des deux mondes
        Dim str As String = "Button1"
Me.Controls.Item(str).Text = "Valider"

je le met aussi hors balise pour le cas où la coloration syntaxique ne permettrai pas la lecture du code !
Dim str As String = "Button1"
Me.Controls.Item(str).Text = "Valider"
Whismeril
Messages postés
12755
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
19 février 2019
466 -
Pour la coloration
Moi
Dim str As String = "Button1"
Me.Controls.Item(str).Text = "Valider"


Toi
Dim str As String = "Button1"
Me.Controls.Item(str).Text = "Valider"


C’est expliqué là
https://codes-sources.commentcamarche.net/faq/11288-les-balises-de-code
robunccm
Messages postés
20
Date d'inscription
jeudi 7 février 2019
Dernière intervention
18 février 2019
-
        private void Remerciements(int compteur)
        {
            MessageBox.Show("Jai compris");
            compteur = compteur + 1000;
            MessageBox.Show("Gracie " + Convert.ToString(compteur));
        }


On peut clore le sujet j'ai de quoi faire
Merci pour la mille et unième fois
Whismeril
Messages postés
12755
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
19 février 2019
466 -
De rien.

Bon week-end
Commenter la réponse de Whismeril
Messages postés
20
Date d'inscription
jeudi 7 février 2019
Dernière intervention
18 février 2019
0
Merci
Merci de ta réponse
Après correction de la coquille sur Oftype
GD.FoCE.Controls.OfType<TextBox>.Single(x => x.Name == "cuArduino" + numArd17x).TextBoxTxbArduino5Text = Convert.ToString(compteur);

j'ai cette erreur
'Queryable.OfType<TResult>(IQueryable)' est un méthode, qui n'est pas valide dans le contexte donné

mais fort de tes conseils je vais restructurer cette partie de mon projet, si tant est que j'assimile les concepts que tu évoques car je suis un autodidacte venu du vieux monde des automatismes et du VBA

mon application est personnelle (modélisme ferroviaire un PC dialogue avec 10 Arduino vie Ethernet)
et pourra souffrir de quelques non respect de la doctrine C
merci encore
Commenter la réponse de robunccm