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

C# Discussion :

Modifier une TextBox depuis une class [erreur CS0038] [Débutant]


Sujet :

C#

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 17
    Points : 11
    Points
    11
    Par défaut Modifier une TextBox depuis une class [erreur CS0038]
    Bonjour a tous,

    débutant en C#, je rencontre un problème lors ce que je veux insérer du texte dans une TextBox depuis une class
    Erreur: Impossible d'accéder à un membre non statique de type externe "...Form1" par l'intermédiaire du type "...Form1.laClass"
    Application en WinForm avec dedans une TextBox nomé txtDebug.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
            private void Form1_Load(object sender, EventArgs e)
            {
                laClass obj = new laClass();
            }
     
            public class laClass
            {
                public laClass() //Constructeur
                {
                    txtDebug.Text += "Du texte a écrire"; //Erreur CS0038
                }
            }
    Ma question est simple, comment puis-je faire pour que ce code fonctionne ?
    A savoir, insérer du texte dans une textbox depuis une class.
    J'ai essayer invoke, delegate, thread mais ça me génère d'autres erreur je n'y arrive pas =/
    Pouvez-vous me donner des exemples de code fonctionnel ?

    En vous remerciant par avance

  2. #2
    Membre habitué
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2011
    Messages
    255
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2011
    Messages : 255
    Points : 193
    Points
    193
    Par défaut
    Je sais pas si j'ai bien saisie ta demande, mais d'après ce que j'ai compris j'aurai fais ça :

    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
    25
    26
    27
    28
     
     
    namespace WindowsFormsApplication2
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
     
            private void Form1_Load(object sender, EventArgs e)
            {
                laClass maClass = new laClass("ajoutTextBox");
                this.textBox1.Text = maClass.text;
            }
        }
     
        public class laClass
        {
            public string text { get; set; }
     
            public laClass(string txt)
            {
                this.text = txt;
            }
        }
    }
    Life myLife = new Life ("eat","sleep","code");

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 17
    Points : 11
    Points
    11
    Par défaut
    Bonjour benny-blanco,

    Merci pour ta réponse ainsi que le code que tu as pris la peine de faire, mais tu n'as pas compris ma demande.

    Je voudrais que la class ajoute de façon autonome du texte dans une textbox, sans passer des argument dans l'appel de cette classe.

    En gros pour expliquer, j'ai dans mon application une class qui sert a gérer des fichiers xml, (le générer, extraire des données, etc..) et je voudrais que dans cette class, je puisse faire afficher du texte dans une textbox (car comme je débute dans le C#, je fais des MessageBox.Show() a l'intérieur de cette class pour voir les étapes que la class fait, et comme je ne veux pas laisser de MessageBox, je voudrais que ça s'écrive dans une textbox).

    Je vous faire partager cette class pour que vous comprenez mieux mon problème;

    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
    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
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
     private void Form1_Load(object sender, EventArgs e)
    {
        xML config = new xML();
        //xML user = new xML("C:\\", "user.xml");
        //xML config = new xML(exePath, "edit.xml");
        //config.info();
    }
     
    public class xML
    {
        private string m_path;
        public string path
        {
            get { return m_path; }
            set { m_path = value; }
        }
        private string m_file;
        public string file
        {
            get { return m_file; }
            set { m_file = value; }
        }
     
        public xML() //Construct default
        {
            this.m_path = Application.StartupPath + "\\";
            this.m_file = "config.xml";
            MessageBox.Show("Construct object xML par défaut!", "Network Info");
            if (construct())
            {
                //Génération du fichier avec succès
                MessageBox.Show("La métode Construct est true");
            }
            else
            {
                MessageBox.Show("Erreur #01: \r\nLa génération du fichier de configuration a échouer;\r\nPath & File: " + this.path + this.file, "Network Info :: Erreur !", MessageBoxButtons.OK, MessageBoxIcon.Stop);
            }
        }
     
        public xML(string path, string file) //Construct avec surcharges
        {
            this.m_path = path;
            this.m_file = file;
            MessageBox.Show("Construct object xML par passage de valeur (file: " + file + " )!");
            if (construct())
            {
                MessageBox.Show("La métode Construct est true");
            }
            else
            {
                MessageBox.Show("Erreur #01: \r\nLa génération du fichier de configuration a échouer;\r\nPath & File: " + this.path + this.file, "Network Info :: Erreur !", MessageBoxButtons.OK, MessageBoxIcon.Stop);
            }
        }
     
        private Boolean construct() //Métode pour construire / chargé le fichier
        {
            try
            {
                if (File.Exists(this.path + this.file)) //Si le fichier xml existe
                {
                    MessageBox.Show("Le fichier: " + this.file + " existe, on dois le chargé");
                    if (load())
                    {
                        //Chargement de la config réussit
                        MessageBox.Show("Chargement du fichier de configuration OK !");
                    }
                    else //Échec du chargement du fichier xML
                    {
                       MessageBox.Show("Erreur #02: \r\nLe chargement du fichier de configuration a échouer;\r\nPath & File: " + this.path + this.file, "Network Info :: Erreur !", MessageBoxButtons.OK, MessageBoxIcon.Stop);
                    }
                }
                else //Le fichier n'existe pas
                {
                    //On le créer avec les valeurs par défaut
                    XmlDocument doc = new XmlDocument();
                    doc.LoadXml("<?xml version=\"1.0\" encoding=\"utf-8\"?><Configuration>"
                            + "<ping profil=\"Default\">"
                            + "<addresse>www.google.fr</addresse>"
                            + "<addresse>www.yahoo.fr</addresse>"
                            + "<intervale>10</intervale>"
                            + "<autoPing>false</autoPing>"
                            + "</ping>"
                            + "</Configuration>");
                    doc.Save(this.path + this.file);
                    MessageBox.Show("Génération par défaut du fichier de configuration : " + this.file);
                    //Chargement de la configuration
                    if (load())
                    {
                        //Chargement de la config réussit
                       MessageBox.Show("Chargement du fichier de configuration OK !");
                    }
                    else //Échec du chargement du fichier xML
                    {
                        MessageBox.Show("Erreur #02: \r\nLe chargement du fichier de configuration a échouer;\r\nPath & File: " + this.path + this.file, "Network Info :: Erreur !", MessageBoxButtons.OK, MessageBoxIcon.Stop);
                    }
                }
                return true;
            }
            catch
            {
                return false;
            }
        }
     
        public Boolean load() //Métode pour charger le fichier (a faire)
        {
            try
            {
                XPathDocument doc;
                XPathNavigator nav;
                XPathExpression expr;
                XPathNodeIterator iterator;
                doc = new XPathDocument(this.path + this.file);
                nav = doc.CreateNavigator();
     
    			//Récupère toutes les adresses
                expr = nav.Compile("/Configuration/ping/addresse");
                iterator = nav.Select(expr);
     
                try
                {
                    while (iterator.MoveNext())
                    {
                        XPathNavigator nav2 = iterator.Current.Clone();
                        MessageBox.Show(nav2.Value);
     
                    }
                }
                catch (Exception ex)
                {
                    MessageBox.Show("ERREUR: " + ex.Message);
                } 
                return true;
            }
            catch
            {
                return false;
            }
        }
     
        ~xML() //Le destructeur
        {
            MessageBox.Show("Object xML détruit", "Network Info");
        }
        public void info() 
        {
            MessageBox.Show("Info sur " + this.file + ":\r\nPath: " + this.path, "Network Info");
        }
    }
    Donc en gros, je voudrais qu'a la place de tous les MessageBox.Show(..), mettre textBox.Text += "..";

    Comment faire ?

    Merci !

  4. #4
    Modérateur

    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 722
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 722
    Points : 5 100
    Points
    5 100
    Par défaut
    Bonjour,

    Tu peux réaliser cela en utilisant un système d'évènement personnalisé.

    Il faut créer une classe gérant un évènement personalisé avec un paramètre de type string.
    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
    25
    26
    using System;
    namespace clsGeneral
    {
        /// <summary>Classe EventArgsMess : évènement personnalisé hérité d'"EventArgs" ayant un paramètre texte (string).</summary>
        public class EventArgsMess : EventArgs
        {
            /// <summary>évènement avec un paramètre.</summary>
            /// <param>"Text" : texte a transmettre.</param>
            public EventArgsMess(string Text) { this.Text = Text; }
            /// <summary>texte transmis.</summary>
            public string Text;
        }
        /// <summary>délégué permettant de créer un Event avec un paramètre de type string.</summary>
        public delegate void EventHandlerMess(object sender, EventArgsMess fe);
     
    }
     
    //utilisation
    //  création dans MaClasse
    //    public event EventHandlerMess EvtNomEvenement;
    //  appel dans MaClasse
    //    EvtNomEvenement(this, new EventArgsMess("Message"));
    //  reception
    //    private MaClasse mc;        
    //    mc.EvtNomEvenement  += OnNomEvenement;
    //    private void OnNomEvenement(object sender, EventArgsMess eam) { "variable" ou "propriété de controle" de type string = eam.Text; }
    Ensuite, il faut déclarer un évènement personnalisé dans ta classe.
    Attention afin de pouvoir être utilisé au niveau des constructeurs, il est créé en static. Il sera donc commun à toutes les instances de ta classe.

    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
    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
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    using System;
    using System.Windows.Forms;
    using clsGeneral;
     
    namespace WindowsFormsApplication1
    {
       public  class xML
    {
     
        /// <summary>EvtMessage est obligatoirement en static pour pouvoir être utilisé au niveau du constructeur</summary>
        public static event EventHandlerMess EvtMessage;
     
        private string m_path;
        public string path
    //...
     
        public xML() //Construct default
        {
     
            this.m_path = Application.StartupPath + "\\";
            this.m_file = "config.xml";
            EvtMessage(this, new EventArgsMess("Construct object xML par défaut!"));
            //MessageBox.Show("Construct object xML par défaut!", "Network Info");
     
            if (construct())
            {
                //Génération du fichier avec succès
                EvtMessage(this, new EventArgsMess("La méthode Construct est true"));
                //MessageBox.Show("La métode Construct est true");
            }
            else
            {
                EvtMessage(this, new EventArgsMess("Erreur #01: La génération du fichier de configuration a échouée"));
                //MessageBox.Show("Erreur #01: \r\nLa génération du fichier de configuration a échouer;\r\nPath & File: " + this.path + this.file, "Network Info :: Erreur !", MessageBoxButtons.OK, MessageBoxIcon.Stop);
            }
        }
     
        public xML(string path, string file) //Construct avec surcharges
        {
            this.m_path = path;
            this.m_file = file;
            EvtMessage(this, new EventArgsMess("Construct object xML par passage de valeur "));
            //MessageBox.Show("Construct object xML par passage de valeur (file: " + file + " )!");
            if (construct())
            {
                EvtMessage(this, new EventArgsMess(""));
                //MessageBox.Show("La métode Construct est true");
            }
            else
            {
                EvtMessage(this, new EventArgsMess("Erreur #01: La génération du fichier de configuration a échouée"));
                //MessageBox.Show("Erreur #01: \r\nLa génération du fichier de configuration a échouer;\r\nPath & File: " + this.path + this.file, "Network Info :: Erreur !", MessageBoxButtons.OK, MessageBoxIcon.Stop);
            }
        }
     
        private Boolean construct() //Métode pour construire / chargé le fichier
        {
            try
            {
                if (File.Exists(this.path + this.file)) //Si le fichier xml existe
                {
                    EvtMessage(this, new EventArgsMess("Le fichier  existe, on dois le chargé"));
                    //MessageBox.Show("Le fichier: " + this.file + " existe, on dois le chargé");
                    if (load())
                    {
                        //Chargement de la config réussit
                        EvtMessage(this, new EventArgsMess("Chargement du fichier de configuration OK "));
                        //MessageBox.Show("Chargement du fichier de configuration OK !");
                    }
                    else //Échec du chargement du fichier xML
                    {
                        EvtMessage(this, new EventArgsMess("Erreur #02: Le chargement du fichier de configuration a échouée"));
                        //MessageBox.Show("Erreur #02: \r\nLe chargement du fichier de configuration a échouer;\r\nPath & File: " + this.path + this.file, "Network Info :: Erreur !", MessageBoxButtons.OK, MessageBoxIcon.Stop);
                    }
                }
    //...
    Note:j'ai tronqué des morceaux de ton code a plusieurs endroit.

    Puis dans ta fenêtre tu abonnes à ton évènement la méthode qui sera déclenchée lorsqu'il sera émit.
    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
    using System;
    using System.Windows.Forms;
    using clsGeneral;
    namespace WindowsFormsApplication1 
    {
        public partial class Form1 : Form
        {
            public Form1() { InitializeComponent(); }
            private void Form1_Load(object sender, EventArgs e)
            {
                txtDebug.Multiline = true;
                // abonnement sur l'évènement (qui est déclaré en static) pour pouvoir recevoir les évènements provenant du constructeur.
                xML.EvtMessage += OnMessage;
                xML config = new xML(); 
            }
            private void OnMessage(object sender, EventArgsMess eam)
            {
                txtDebug.Text += eam.Text + "\r\n";
            }
        }
    }
    A+, Hervé.
    Traductions d'articles :
    La mémoire en .NET - Qu'est-ce qui va où ?
    Architecture DAL de haute performance et DTO ; Version C# : Partie 1,Partie 2,Partie 3 — Version VB.NET : Partie 1,Partie 2,Partie 3
    N'hésitez pas à consulter la FAQ VB.NET, le cours complet de Philippe Lasserre et tous les cours, articles et tutoriels.

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 17
    Points : 11
    Points
    11
    Par défaut
    Bonjour rv26t !

    Cette nuit en surfant depuis mon iPhone sur le forum, j'ai vue ta réponse et je savais qu'en me levant j'aller réussir a résoudre mon problème grâce a ton aide
    Chose faite, je viens d'appliqué ta solution et ça fonctionne très bien je t'es suis extrêmement reconnaissant !

    Je vais pouvoir maintenant continué a développer mon app sereinement


    Merci encore rv26t !

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 13/04/2015, 11h17
  2. [XL-2010] Problème insertion depuis une textbox dans une cellule
    Par Phifou dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 05/09/2014, 10h50
  3. [C#] Remplir une textbox depuis une base de donnée
    Par Nicos6414 dans le forum Windows Forms
    Réponses: 1
    Dernier message: 11/04/2011, 12h03
  4. Réponses: 8
    Dernier message: 05/11/2010, 08h10
  5. accéder a une textbox depuis une class
    Par Alex35 dans le forum ASP.NET
    Réponses: 10
    Dernier message: 30/07/2008, 16h32

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