Adressage indexé d'un control

Résolu
robunccm Messages postés 53 Statut Membre -  
 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

3 réponses

  1. 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
  2. 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
    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
    2. robunccm Messages postés 53 Statut Membre 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
    3. robunccm Messages postés 53 Statut Membre 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
    4. Utilisateur anonyme
       
      De rien.

      Bon week-end
      0
  3. robunccm Messages postés 53 Statut Membre 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