IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Forms Discussion :

Trouver un controleur en connaissant une partie de son nom [Débutant]


Sujet :

Windows Forms

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2018
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2018
    Messages : 8
    Par défaut Trouver un controleur en connaissant une partie de son nom
    Bonjour, voici mon tout premier post sur ce forum, j'espère donc qu'il sera compréhensible
    Désolé si la question à déjà était posée, je ne sais pas vraiment si je formule bien ce que je cherche à faire (ce qui se voit peut être dans le titre) je n'ai donc pas trouver ma réponse sur Google.

    Je travaille actuellement sur une machine, pour la demande qui me concerne sur ce sujet, je ne fais que récupérer les données mémoires que je lui demande, enfin ceci n'est que le contexte.
    Ansi, je récupère chaque valeur de chaque mémoire dans différentes textbox en les parcourant une à une avec un foreach, puis j'appelle une fonction qui va vérifier que les données récupérées sont correctes. Jusque là, aucun soucis.
    Le problème arrive ensuite, je peux également changer la valeur d'une textbox, ce qui appellera ensuite une autre fonction qui ne vérifiera que la valeur de la textbox, le nom de la textbox est connue par ActiveControl.Name. Mais ! J'ai ensuite une pictureBox invisible pour chaque textbox qui sera visible ou invisible selon la valeur de la textbox, bref rien de trop compliquer...

    Mais mon code actuel ressemble à ceci :
    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    private bool VerifParamSetV2()
            {
                // Si retourne false les changements ne s'effectueront pas
                bool isOk = true;
                string activeControl = ActiveControl.Name;
     
                // Selon la textbox active
                switch (activeControl)
                {
                    case "textBox_iNum100":
                        // Si la textbox est vide
                        if (textBox_iNum100.Text == "")
                        {
                            MessageBox.Show("La valeur ne peut être vide !", "Erreur !", MessageBoxButtons.OK);
                            isOk = false;
                            pictureBox_iNum100.Image = Properties.Resources.red_warning;
                            toolTip_description.SetToolTip(pictureBox_iNum100, "La valeur ne peut être vide !");
                            pictureBox_iNum100.Visible = true;
                            GetParam();
                        }
                        else
                        {
                            // Si la valeur par défaut es bien celle ci
                            if (int.Parse(textBox_iNum100.Text) == 55)
                            {
                                toolTip_description.SetToolTip(pictureBox_iNum100, "La vitesse de travail de l'axe est normalement à 55 par défaut !");
                                pictureBox_iNum100.Image = Properties.Resources.coche;
                                pictureBox_iNum100.Visible = true;
                            }
                            else
                            {
                                pictureBox_iNum100.Visible = false;
                            }
                        }
                        break;
     
                    case "textBox_iNum101":
                        if (textBox_iNum101.Text == "")
                        {
                            MessageBox.Show("La valeur ne peut être vide !", "Erreur !", MessageBoxButtons.OK);
                            isOk = false;
                            pictureBox_iNum101.Image = Properties.Resources.red_warning;
                            toolTip_description.SetToolTip(pictureBox_iNum101, "La valeur ne peut être vide !");
                            pictureBox_iNum101.Visible = true;
                            GetParam();
                        }
                        else
                        {
                            // Si la valeur n'est pas dans la plage
                            if (int.Parse(textBox_iNum101.Text) < 0 || int.Parse(textBox_iNum101.Text) > 1024)
                            {
                                toolTip_description.SetToolTip(pictureBox_iNum101, "Le seuil cel eti doit etre compris entre 0 et 1024 !");
                                pictureBox_iNum101.Visible = true;
                                MessageBox.Show("Le seuil cel eti doit etre compris entre 0 et 1024 !", "Erreur !", MessageBoxButtons.OK);
                                isOk = false;
                                GetParam();
                            }
                            else
                            {
                                pictureBox_iNum101.Visible = false;
                            }
                        }
                        break;
     
                        // Etc j'ai une liste de 100 mémoires

    Vous me direz que ça marche, oui certes, mais le seul bémol c'est que je suis obliger de faire un switch avec le nom de ma textbox pour pouvoir agir sur la picturebox qui lui est "associée", ce qui le rend un peu lourd et indigeste je trouves.
    Je me dis que je peux substring le nom de ma textbox pour garder seulement le numéro mémoire (exemple : 100) vu que mes picturebox ont le même numéro, j'aimerai retrouver le nom de la picturebox qui à ce numéro ce qui me permettrai de changer directement la picturebox lié à la textbox ce qui pourrai alléger une partie du code.

    Ma question est donc, y a t il un moyen que j'agisse sur ma picture box en connaissant seulement le numéro de fin dans le nom de celle-ci, ou peut être qu'il y d'autre moyen plus simple.

    Merci, d'avance !
    Ax

  2. #2
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Mars 2011
    Messages
    109
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Cher (Centre)

    Informations forums :
    Inscription : Mars 2011
    Messages : 109
    Par défaut
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Private Sub Button_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button_01.Click, Button_02.Click
            Dim num As String = sender.name.Substring(sender.name.IndexOf("_"))
            Dim pb As PictureBox = Me.Controls("PictureBox" & num)
            If pb.Visible Then
                pb.Visible = False
            Else
                pb.Visible = True
            End If
    End Sub
    Un petit exemple en vb (je fais encore trop d'erreurs avec la syntaxe C#)
    deux boutons (Button_01 et Button_02)
    deux picturebox (Picturebox_01 et Picturebox_02)

    En cliquant sur un bouton, on rend visible ou invisible la picturebox ayant le même "numéro".
    Il est possible que le Me.Controls soit à remplacer par une localisation plus compliquée si, par exemple, tu as intercalé des panels.

  3. #3
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2018
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2018
    Messages : 8
    Par défaut
    Bonjour, désolé de ma réponse tardive.
    Je vois le concept (même si je ne connais pas bien le VB).

    J'ai donc essayer plusieurs solutions :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    // Complétement la même que la tienne
    PictureBox pb = Controls("pictureBox_iNum" + num);
    // Impossible d'utiliser un membre "Control.Controls" ne pouvant être appelé comme une méthode
     
    PictureBox pb = Controls.IndexOf("pictureBox_iNum" + num);
    // Argument 1 : conversion impossible de 'string' en 'System.Windows.Form.Control'
     
    PictureBox pb = Name("pictureBox_iNum" + 113);
    // Impossible d'utiliser un membre "Control.Name" ne pouvant être appelé comme une méthode
    Il a des choses qui semblent stupides dans les recherches que j'ai mise mais bon j'ai voulu tester et encore je n'ai pas mis les plus débiles

    Mais bon toujours sans succès, le VB à l'air beaucoup plus simple que le C# pour ce que je souhaite faire.

    Je vais quand même continuer mes recherche peut être que par miracle la réponse tombera du ciel, qui sait.

  4. #4
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Mars 2011
    Messages
    109
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Cher (Centre)

    Informations forums :
    Inscription : Mars 2011
    Messages : 109
    Par défaut
    C'est pas plutôt ça en C# ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    // Complétement la même que la tienne
    //PictureBox pb = Controls("pictureBox_iNum" + num);
    // Impossible d'utiliser un membre "Control.Controls" ne pouvant être appelé comme une méthode
    PictureBox pb = this.Controls("pictureBox_iNum" + num);

  5. #5
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2018
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2018
    Messages : 8
    Par défaut
    Alors techniquement si, sauf que en C# le "this" me permet de dire que je suis dans mon Form.
    E vu que je travaille directement dans le code de mon Form, le this n'est pas forcement nécessaire et même avec celui-ci l'erreur reste la même que sans.

  6. #6
    Membre émérite
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juillet 2005
    Messages
    562
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2005
    Messages : 562
    Par défaut
    Bonjour,

    Plusieurs remarques qui a défaut de donner une réponse claire, fera un un peu avancer le chmilblique !

    Astuce à tester :
    • Vous pourriez utiliser la propriété Tag des textbox pour enregistrer dedans le nom des picturebox qu'elles sont sensées modifier.
    • utiliser un dictionary pour lister les nom des controls et les retrouver facilement. Je lui mets comme key le nom du control, puis en value le control, je peux ainsi facilement retrouver une référence vers mon control à partir de son nom.
    • ...


    Pour de meilleurs conseils, et être plus précis, il faudrait savoir comment est construite votre interface ? Par le designer, tout à la mano avec les controls de base ? ou alors il y a des usercontrol, ajouté par le code ??? ou alors usercontrol + designer ....

    en C# le "this" me permet de dire que je suis dans mon Form.
    Le this de C# et l'equivalent du Me de vb.net et fait référence à l'instance de la classe. C'est à dire dans votre cas, lorsque vous êtes dans une form (dans le code source de la form), le this (ou le Me) fait référence à l'instance de cette class et donc à l'instance de cette form. Cependant, si vous créer une class que vous appeler MaClass par exemple et que vous lui ajouter une propriété MaPropriété, dans le code de cette classe vous pourrez alors faire référence à cette propriété avec un Me.MaPropriete ou this.MaPropriete

    D'un point de vue général je dirais que tu te trompe de problème, tu devrais apprendre l'object et ne plus que penser object ! du coup ces difficultés disparaitront car .net est une plateforme tout object. Ainsi tu écrirais une classe Memoire avec une fonction IsValid() par exemple et une propriété string qu'on appelerait DataMemory et en fonction de ce qu'il y a dans DataMemory, IsValid() retournera true ou false...
    Puis un usercontrol qui prend en parametre un object Memoire qui fournit une textbox contenant le DataMemory (permettant de le modifier) et qui en fonction du IsValid() va afficher une picturebox ou non .... bref je pense que tu commence a cerner le truc, en fesant de l'object tu n'aurais pas ce problème, car chaque mémoire (j'avoue que maintenant, mais en faite j'ai pas capté ton histoire de mémoire...) serait directement "liée" à sa picturebox qui elle s'afficherait directement (ou pas) suivant ce que l'on fait dans la textbox ...

    Bon code,
    J@ck.

  7. #7
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2018
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2018
    Messages : 8
    Par défaut
    Problème résolu.
    Bon c'était quasiment ça, y avais juste à récupérer toute la liste des contrôleurs et à savoir l'utiliser (J'avais essayer plusieurs fois sans trop comprendre comment l'utiliser). Sacré C# !

    Je mets quand même la solution au cas ou quelqu'un la chercherai.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
     
     
     
    private void textBox_Txt_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e)
            {
                if (e.KeyCode == Keys.Enter)
                {
                    if (VerifParamSetV2() == true)
                    {
                        Seal.SetParam(NumSeal, new SealApplicatorParam(((TextBox)sender).Tag, int.Parse(ActiveControl.Text)));
                        ActiveControl.BackColor = Color.LightGreen;
                        timer_textBoxClign.Start();
                        e.Handled = true;
                        // Je récupére tout mes controls qui ont pour nom "pictureBox_iNum" + le tag de la textbox qui envoie l'info (ça marche aussi avec le substring du activeControl pour garder le numéro de fin, mais le tag est plus simple je trouve)                 
                        Control[] cCtrl =  this.Controls.Find("pictureBox_iNum" + ((TextBox)sender).Tag, false);
     
                        // On regarde si l'élément est bien une pictureBox (Normalement dans mon cas il y  en a un seul)
                        if(cCtrl[0].GetType() == typeof(PictureBox))
                        {
                            // On peut le traiter
                        }
                    }
                }
            }
    Voilà, merci à toi Baloub de m'avoir aiguiller sur la bonne voie !


    Citation Envoyé par J@ckHerror Voir le message
    Bonjour,

    Plusieurs remarques qui a défaut de donner une réponse claire, fera un un peu avancer le chmilblique !

    Astuce à tester :
    • Vous pourriez utiliser la propriété Tag des textbox pour enregistrer dedans le nom des picturebox qu'elles sont sensées modifier.
    • utiliser un dictionary pour lister les nom des controls et les retrouver facilement. Je lui mets comme key le nom du control, puis en value le control, je peux ainsi facilement retrouver une référence vers mon control à partir de son nom.
    • ...


    Pour de meilleurs conseils, et être plus précis, il faudrait savoir comment est construite votre interface ? Par le designer, tout à la mano avec les controls de base ? ou alors il y a des usercontrol, ajouté par le code ??? ou alors usercontrol + designer ....



    Le this de C# et l'equivalent du Me de vb.net et fait référence à l'instance de la classe. C'est à dire dans votre cas, lorsque vous êtes dans une form (dans le code source de la form), le this (ou le Me) fait référence à l'instance de cette class et donc à l'instance de cette form. Cependant, si vous créer une class que vous appeler MaClass par exemple et que vous lui ajouter une propriété MaPropriété, dans le code de cette classe vous pourrez alors faire référence à cette propriété avec un Me.MaPropriete ou this.MaPropriete

    D'un point de vue général je dirais que tu te trompe de problème, tu devrais apprendre l'object et ne plus que penser object ! du coup ces difficultés disparaitront car .net est une plateforme tout object. Ainsi tu écrirais une classe Memoire avec une fonction IsValid() par exemple et une propriété string qu'ont appelerais DataMemory et en fonction de ce qu'il y a dans DataMemory, IsValid() retournera true ou false...
    Puis un usercontrol qui prend en parametre un object Memoire qui fournit une textbox contenant le DataMemory (permettant de le modifier) et qui en fonction du IsValid() va afficher une picturebox ou non .... bref je pense que tu commence a cerner le truc...

    Bon code,
    J@ck.
    Je viens de voir ton message après avoir créer celui-ci, je te remercie. Ta méthode à l'air plus propre que la mienne mais un peu plus complexe pour un adepte comme moi
    Sinon pour répondre tout de même mon designer est fais à la mano et j'ai rajouter les tags sur chaque textbox ce qui m’enlevè la récurrence du ActiveControl.Substring(12,3) sur mes textbox.
    En tout cas je gardes tout ça de côté pour essayer de faire quelque chose de plus joli que ce que je viens de faire.

    Cordialement, Ax.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Ouvrir fichier en connaissant qu'une partie de son nom ?
    Par Muller Guy dans le forum Général Python
    Réponses: 10
    Dernier message: 13/12/2017, 11h20
  2. [XL-2010] Ouvrir fichier Excel avec une partie de son nom
    Par juluseless dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 20/10/2014, 14h12
  3. [XL-2007] Ouverture d'un fichier en fonction d'une partie de son nom
    Par Yamiral dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 09/11/2012, 17h02
  4. [XL-2002] Sélectionner fichier en fonction d'une partie de son nom
    Par johan89 dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 02/11/2011, 20h48
  5. Recherche d'un repertoire avec une partie de son nom[D7] [XP]
    Par LHT dans le forum API, COM et SDKs
    Réponses: 2
    Dernier message: 21/08/2009, 16h28

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo