Adressage indexé d'un control

Résolu/Fermé
robunccm Messages postés 52 Date d'inscription jeudi 7 février 2019 Statut Membre Dernière intervention 9 mars 2024 - 7 févr. 2019 à 19:09
 Utilisateur anonyme - 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
A voir également:

3 réponses

Utilisateur anonyme
8 févr. 2019 à 07:06
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
1
Utilisateur anonyme
8 févr. 2019 à 09:58
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
1
Utilisateur anonyme
8 févr. 2019 à 09:59
Ps pour la coloration syntaxique, tu n’as pas imposé la.coloration csharp, du coup ça fait un pavé tout gris
0
robunccm Messages postés 52 Date d'inscription jeudi 7 février 2019 Statut Membre Dernière intervention 9 mars 2024 1
8 févr. 2019 à 11:06
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"
0
Utilisateur anonyme
8 févr. 2019 à 13:23
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
0
robunccm Messages postés 52 Date d'inscription jeudi 7 février 2019 Statut Membre Dernière intervention 9 mars 2024 1
8 févr. 2019 à 14:40
        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
0
Utilisateur anonyme
8 févr. 2019 à 16:10
De rien.

Bon week-end
0
robunccm Messages postés 52 Date d'inscription jeudi 7 février 2019 Statut Membre Dernière intervention 9 mars 2024 1
8 févr. 2019 à 09:09
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
0