Adressage indexé d'un control

Résolu
robunccm Messages postés 53 Date d'inscription   Statut Membre Dernière intervention   -  
 Utilisateur anonyme -
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
 
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
 
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
 
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 53 Date d'inscription   Statut Membre Dernière intervention   1
 
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
 
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 53 Date d'inscription   Statut Membre Dernière intervention   1
 
        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
 
De rien.

Bon week-end
0
robunccm Messages postés 53 Date d'inscription   Statut Membre Dernière intervention   1
 
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