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 :

[C#] Problème d'héritage, aide svp :(


Sujet :

Windows Forms

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2003
    Messages : 68
    Points : 43
    Points
    43
    Par défaut [C#] Problème d'héritage, aide svp :(
    Salut,

    Voila, je vais réduire mon problème au niveau le plus simple possible, j'ai une forme ex Form1 avec un TextBox1 dessus. J'ai ensuite une class TestH par exemple. Une méthode de cette class doit modifier la propriété Text de TextBox1. Pour y accéder j'ai donc supposer qu'il fallais hériter Form1 à la class TestH et déclarer le controle TextBox1 en public au lieu de private dans le début du code de Form1.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    Class TestH : Form1
    {
         public TestH()
         {
               //constructor
         }
     
         public void ChangeTxt()
         {
               TextBox1.Text = "test";
         }
    }
    Lors de l'évènement FormLoad de Form1 je déclare la class TestH et utilise la méthode ChangeTxt(). Le programme compile sans problème, se lance, mais la textbox reste toujours vide, la méthode semble ne rien changer.

    Merci de votre aide d'avance.

  2. #2
    Rédacteur
    Avatar de JauB
    Homme Profil pro
    Freelancer
    Inscrit en
    Octobre 2005
    Messages
    1 792
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Maroc

    Informations professionnelles :
    Activité : Freelancer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 792
    Points : 2 914
    Points
    2 914
    Par défaut
    c'est pas bon de procéder de cette manière. enfin pour moi j'aurai fait comme suit:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    'pour la classe TestH
    Public Class TestH
        Public Function changtxt()
            Return "test"
        End Function
    End Class
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    'pour la classe Form1
     Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
     
            Dim MaClass As New TestH
            TextBox1.Text = Maclass.changtxt
        End Sub
    c'est du VB.net mais c'est la même chose pour C#
    Bon Courage

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2003
    Messages : 68
    Points : 43
    Points
    43
    Par défaut
    Citation Envoyé par JauB
    c'est pas bon de procéder de cette manière. enfin pour moi j'aurai fait comme suit:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    'pour la classe TestH
    Public Class TestH
        Public Function changtxt()
            Return "test"
        End Function
    End Class
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    'pour la classe Form1
     Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
     
            Dim MaClass As New TestH
            TextBox1.Text = Maclass.changtxt
        End Sub
    c'est du VB.net mais c'est la même chose pour C#
    Bon Courage
    Merci pour l'aide, dans mon exemple oui ca pourrais se faire, mais en pratique mon programme est beaucoup plus gros, et cette méthode m'obligerais a mettre beaucoup de code dans le Form1, j'aurais vraiment besoin de pouvoir accéder aux propriétés des controles directement depuis une class regroupant toutes les fonctions.

  4. #4
    Xno
    Xno est déconnecté
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 71
    Points : 83
    Points
    83
    Par défaut
    Là, j'ai un peu de mal à comprendre ce que tu veux faire avec un héritage de classe si c'est pour appeler la classe fille à partir de la classe mère.

    Si tu hérites la classe TestH de la classe Form1, TestH est une "spécialisation" de Form1. Tu dois ensuite travailler avec TestH dans ton programme principal.

    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
    public class Form1 : System.Windows.Forms.Form
    {  
         ...
     
           protected System.Windows.Forms.TextBox textBox1;
     
            public Form1()
            {
                //
                // Required for Windows Form Designer support
                //
                InitializeComponent();
     
                //
                // TODO: Add any constructor code after InitializeComponent call
                //
                this.textBox1.Text = "Form1";
            }
     
        ...
    }
     
         public class TestH : Form1
        {
            public TestH()
            {
                //
                // TODO: Add constructor logic here
                //
                this.textBox1.Text = "TestH";
            }
     
            /// <summary>
            /// The main entry point for the application.
            /// </summary>
            [STAThread]
            static void Main() 
            {
                Application.Run(new TestH());
            }
        }
    Le contrôle TextBox est bien initialisé avec la valeur "TestH".

  5. #5
    Rédacteur
    Avatar de JauB
    Homme Profil pro
    Freelancer
    Inscrit en
    Octobre 2005
    Messages
    1 792
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Maroc

    Informations professionnelles :
    Activité : Freelancer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 792
    Points : 2 914
    Points
    2 914
    Par défaut
    donc je te propose de faire comme suit:
    déclare ton textbox dans un module ( en faisant juste un couper coller de la déclaration faite faite par l'IDE et en changeant le mot clé friend par public
    les autres déclaration tu les laisses ( comme les :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
     textICI.Location = New System.Drawing.Point(256, 432)
            TextBox1.Name = "textICI"
            TextBox1.Size = New System.Drawing.Size(128, 20)
            TextBox1.TabIndex = 14
            TextBox1.Text = "TextBox1"
    et en elevant le mot clé Me.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Module Module1
        Public WithEvents TextBox1 As System.Windows.Forms.TextBox
    End Module

    comme ça tu n'auras plus besoin d'héritage. et tu peux faire comme tu as fait au début.

    N.B: j'ai testé ce que je viens de te poster et ça marche nickel

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2003
    Messages : 68
    Points : 43
    Points
    43
    Par défaut
    Citation Envoyé par JauB
    donc je te propose de faire comme suit:
    déclare ton textbox dans un module ( en faisant juste un couper coller de la déclaration faite faite par l'IDE et en changeant le mot clé friend par public
    les autres déclaration tu les laisses ( comme les :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
     textICI.Location = New System.Drawing.Point(256, 432)
            TextBox1.Name = "textICI"
            TextBox1.Size = New System.Drawing.Size(128, 20)
            TextBox1.TabIndex = 14
            TextBox1.Text = "TextBox1"
    et en elevant le mot clé Me.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Module Module1
        Public WithEvents TextBox1 As System.Windows.Forms.TextBox
    End Module
    comme ça tu n'auras plus besoin d'héritage. et tu peux faire comme tu as fait au début.

    N.B: j'ai testé ce que je viens de te poster et ça marche nickel
    Je voudrais bien essayé mais moi c'est du C#, pas du VB, je ne suis pas trop sure de comment faire ce que tu dis en C#.

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2003
    Messages : 68
    Points : 43
    Points
    43
    Par défaut
    Citation Envoyé par Xno
    Là, j'ai un peu de mal à comprendre ce que tu veux faire avec un héritage de classe si c'est pour appeler la classe fille à partir de la classe mère.

    Si tu hérites la classe TestH de la classe Form1, TestH est une "spécialisation" de Form1. Tu dois ensuite travailler avec TestH dans ton programme principal.

    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
    public class Form1 : System.Windows.Forms.Form
    {  
         ...
     
           protected System.Windows.Forms.TextBox textBox1;
     
            public Form1()
            {
                //
                // Required for Windows Form Designer support
                //
                InitializeComponent();
     
                //
                // TODO: Add any constructor code after InitializeComponent call
                //
                this.textBox1.Text = "Form1";
            }
     
        ...
    }
     
         public class TestH : Form1
        {
            public TestH()
            {
                //
                // TODO: Add constructor logic here
                //
                this.textBox1.Text = "TestH";
            }
     
            /// <summary>
            /// The main entry point for the application.
            /// </summary>
            [STAThread]
            static void Main() 
            {
                Application.Run(new TestH());
            }
        }
    Le contrôle TextBox est bien initialisé avec la valeur "TestH".
    Ce que tu dis est effectivement plus logique, ca marche dans un exemple tout simple comme celui ci, je vais maintenant essayer de l'adapter a mon programme.

    Le problème étant que ca marche tant qu'on change le text par le constructeur de TestH, mais lorsque je veux le faire dans une méthode de TestH que Form1 appel lors de son event FormLoad, ca ne marche plus.

    Une idée ?

  8. #8
    Rédacteur
    Avatar de JauB
    Homme Profil pro
    Freelancer
    Inscrit en
    Octobre 2005
    Messages
    1 792
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Maroc

    Informations professionnelles :
    Activité : Freelancer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 792
    Points : 2 914
    Points
    2 914
    Par défaut
    Citation Envoyé par choas
    Je voudrais bien essayé mais moi c'est du C#, pas du VB, je ne suis pas trop sure de comment faire ce que tu dis en C#.
    tu ne vas rien faire à part un copier/coller de ta fonction déclaration de ton textbox1 en la rendant public dans un module. tu execute et si çate génére un problème alors tu enlèves les mots clés my je pense que c'est l'equivalent de me en VB.Net.

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2003
    Messages : 68
    Points : 43
    Points
    43
    Par défaut
    Citation Envoyé par JauB
    tu ne vas rien faire à part un copier/coller de ta fonction déclaration de ton textbox1 en la rendant public dans un module. tu execute et si çate génére un problème alors tu enlèves les mots clés my je pense que c'est l'equivalent de me en VB.Net.
    Il n'y a pas de module en C#, il n'y a que des class je pense, et le me doit surement etre l'équivalent du pointer this. J'ai trouver comment faire l'équivalent de ta proposition en C# mais c pas très propre a mon gout :p

    Il faut créé une class 'abstract' (ex. Global) déclarer le textbox dedans en 'public static', et ensuite dans le code du Form1 remplacer tout les this.textBox1 par Global.textBox1.

  10. #10
    Xno
    Xno est déconnecté
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 71
    Points : 83
    Points
    83
    Par défaut
    Le problème étant que ca marche tant qu'on change le text par le constructeur de TestH, mais lorsque je veux le faire dans une méthode de TestH que Form1 appel lors de son event FormLoad, ca ne marche plus.

    Dans la notion d'héritage de classe, la classe mère (ici Form1) n'appelle pas de méthode de la classe héritée (ici TestH). C'est le contraire.

    Ce qu'il faut faire, c'est implémenter l'événement Load dans la classe fille (TestH). Le petit problème c'est que l'on ne peut pas utiliser Form1_Load directement. Il faut implémenter la méthode OnLoad dans les classes Form1 et TestH.

    Plus clairement, cela donne ceci:

    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
        public class TestH : Form1
        {
            public TestH()
            {
            }
    
            protected override void OnLoad(EventArgs e)
            {
                this.textBox1.Text = "TestH";
                base.OnLoad( e ); // appel de la méthode OnLoad de la classe mère
            }
    
            /// <summary>
            /// The main entry point for the application.
            /// </summary>
            [STAThread]
            static void Main() 
            {
                Application.Run( new TestH() );
            }
        }
    
        /// <summary>
        /// Summary description for Form1.
        /// </summary>
        public class Form1 : System.Windows.Forms.Form
        {
            protected System.Windows.Forms.TextBox textBox1;
    
            /// <summary>
            /// Required designer variable.
            /// </summary>
            private System.ComponentModel.Container components = null;
    
            public Form1()
            {
                //
                // Required for Windows Form Designer support
                //
                InitializeComponent();
            }
    
            /// <summary>
            /// Clean up any resources being used.
            /// </summary>
            protected override void Dispose( bool disposing )
            {
                if( disposing )
                {
                    if (components != null) 
                    {
                        components.Dispose();
                    }
                }
                base.Dispose( disposing );
            }
    
            Windows Form Designer generated code
    
            protected override void OnLoad(EventArgs e)
            {
                this.textBox1.Text = "Form1"; 
            }
        }
    En lançant ce code, la valeur de la TextBox doit être "Form1" car la méthode OnLoad de la classe mère Form1 est appelée depuis la classe fille TestH. Si tu commentes la ligne dans la méthode OnLoad de la classe fille, la méthode OnLoad de la classe mère ne sera pas appelée, et la valeur de la Textbox sera alors celle initialisée dans la classe TestH.

  11. #11
    Rédacteur
    Avatar de JauB
    Homme Profil pro
    Freelancer
    Inscrit en
    Octobre 2005
    Messages
    1 792
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Maroc

    Informations professionnelles :
    Activité : Freelancer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 792
    Points : 2 914
    Points
    2 914
    Par défaut
    sincèrement je ne vois pas du tout l'utilité d'héritage dans ton contexte....il faut voir les choses du bon angle pour que ça marche et pour que les autres puissent comprndre ton code!
    enfin...Bon Courage ami

  12. #12
    Xno
    Xno est déconnecté
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 71
    Points : 83
    Points
    83
    Par défaut
    C'est clur, mais il faudrait voir l'architecture du programme pour savoir si l'héritage de classe est la bonne solution.


  13. #13
    Membre émérite Avatar de shadowmoon
    Homme Profil pro
    Expert technique et fonctionnel .Net
    Inscrit en
    Mai 2005
    Messages
    1 066
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Expert technique et fonctionnel .Net
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 066
    Points : 2 645
    Points
    2 645
    Par défaut
    je tiens à signaler :

    1 - il existe un équivalent au mot-clé me du VB.Net en C#, c'est le mot-clé this.

    2 - on peut tout à fait faire des modules C#

    De plus, à mon avis, il n'y a pas besoin d'héritage. Il faut déclarer ta fonction TestH dans ta classe form1 avec le code :

    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
     
    public Class Form1
    {
     
      ...
     
    // surcharge du constructeur de form1
    public Form1(chaine as string)
            {
                //
                // Required for Windows Form Designer support
                //
                InitializeComponent();
                TestH(chaine);
            }
     
    ...
     
    public TestH(chaine as String)
            {
             textBox1.Text = chaine; ou alors this.textbox1.Text = chaine; //(j'ai un doute sur la nécessité du this)
            }
     
    ...
     
    }

Discussions similaires

  1. Problème fichiers de zone BIND9 ubuntu aide svp !
    Par onlinematchs dans le forum Réseau
    Réponses: 0
    Dernier message: 18/05/2012, 01h24
  2. Réponses: 1
    Dernier message: 06/05/2011, 21h29
  3. Réponses: 6
    Dernier message: 15/11/2010, 09h47
  4. héritage de table sous ORACLE, AIDE SVP
    Par gilardino dans le forum Oracle
    Réponses: 4
    Dernier message: 18/10/2007, 23h44
  5. Problème restauration avec Nero, aide svp
    Par capone dans le forum Autres Logiciels
    Réponses: 1
    Dernier message: 12/08/2006, 22h37

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