Partage
  • Partager sur Facebook
  • Partager sur Twitter

Interagir avec une WindowsForm via un UserControl

Sujet résolu
    15 novembre 2018 à 21:23:29

    Bonjour, bonsoir

    Je suis bloqué sur un problème depuis assez longtemps :( . Quand je lance mon programme, j'ai un WindowsForm (classe "Accueil") qui s'affiche. Ce WindowsForm est constitué de quelques UserControls qui servent à afficher des pages sans interactions particulières, sauf un.

    Cet UserControl (classe "Commencer") contient un bouton, et j'aimerais pouvoir, en cliquant dessus, interagir avec le WindowsForm (de classe "Accueil") principal, mais c'est ici que je bloque. J'ai tenté plusieurs choses mais rien ne fonctionne, j'ai par exemple essayé de créer un événement avec ce bouton, qui lance une méthode de la classe "Accueil" (le WindowsForm) mais cela ne fonctionne pas. Je n'ai sûrement pas tout compris avec le système de classes ou quelque chose comme ça.

    J'espère que je me suis assez bien expliqué, si il y a besoin de plus de précisions je suis toujours disponible :) !

    • Partager sur Facebook
    • Partager sur Twitter
    ~(‾▿‾~)
      15 novembre 2018 à 21:39:51

      Bonjour Monsieur Kiki,

      Je n'ai pas trouvé comment faire aussi :(.

      J’espère trouver la marche à suivre tout comme vous :euh:.

      Merci d'avoir posé la question ;).

      Bonne continuation .

      -
      Edité par MataWaga 15 novembre 2018 à 22:12:35

      • Partager sur Facebook
      • Partager sur Twitter
        16 novembre 2018 à 17:37:04

        Hola !

        Un truc comme ça ?

        Form.cs
        public partial class FormBis : Form
            {
                public FormBis()
                {
                    InitializeComponent();


        // Assigne la fonction du Form au delegate du userControl m_userControl.Btn_Clicked += new myUC.BtnClick(newForm_Btn_Clicked); } public void newForm_Btn_Clicked() { this.Width = 0xF00; } }
        Form.Designer.cs
        partial class FormBis
            {
                /// <summary>
                /// Required designer variable.
                /// </summary>
                private System.ComponentModel.IContainer components = null;
        
                /// <summary>
                /// Clean up any resources being used.
                /// </summary>
                /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
                protected override void Dispose(bool disposing)
                {
                    if (disposing && (components != null))
                    {
                        components.Dispose();
                    }
                    base.Dispose(disposing);
                }
        
                #region Windows Form Designer generated code
        
                /// <summary>
                /// Required method for Designer support - do not modify
                /// the contents of this method with the code editor.
                /// </summary>
                private void InitializeComponent()
                {
                    this.components = new System.ComponentModel.Container();
                    this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
                    this.ClientSize = new System.Drawing.Size(800, 450);
                    this.Text = "FormBis";
                    this.m_userControl = new myUC(); //--> Alloc 
        
                    ///
                    /// m_userControl
                    ///
                    this.m_userControl.Name = "passwordStrength";
                    this.m_userControl.TabStop = false;
        
                    ///
                    /// The current Form
                    /// 
                    this.Controls.Add(this.m_userControl); // --> Add userControl au Form
                }
        
                #endregion
        
                private myUC m_userControl;
            }
        UserControl.cs
        public partial class myUC : UserControl
            {
                public myUC()
                {
                    InitializeComponent();
                }
        
                public delegate void BtnClick();
                public event BtnClick Btn_Clicked; // --> Crée un event pour ton delegate
        
                private void buttonUserControl_Click(object sender, EventArgs e) // --> ça, c'est le button1, j'ai pas changé le nom partout parce que la flemme avant tout
                {
                    Btn_Clicked(); //L'event d'appuie sur le bouton du userControl déclenche l'event (pas le même du coup, faut suivre hein !) lié au delegate
                }
            }
        UserControl.Designer.cs
        partial class myUC
            {
                /// <summary> 
                /// Required designer variable.
                /// </summary>
                private System.ComponentModel.IContainer components = null;
        
                /// <summary> 
                /// Clean up any resources being used.
                /// </summary>
                /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
                protected override void Dispose(bool disposing)
                {
                    if (disposing && (components != null))
                    {
                        components.Dispose();
                    }
                    base.Dispose(disposing);
                }
        
                #region Component Designer generated code
        
                /// <summary> 
                /// Required method for Designer support - do not modify 
                /// the contents of this method with the code editor.
                /// </summary>
                private void InitializeComponent()
                {
                    this.button1 = new System.Windows.Forms.Button();
                    this.SuspendLayout();
                    // 
                    // button1
                    // 
                    this.button1.Location = new System.Drawing.Point(45, 48);
                    this.button1.Name = "button1";
                    this.button1.Size = new System.Drawing.Size(147, 38);
                    this.button1.TabIndex = 0;
                    this.button1.Text = "button1";
                    this.button1.UseVisualStyleBackColor = true;
                    this.button1.Click += new System.EventHandler(this.buttonUserControl_Click);
                    // 
                    // myUC
                    // 
                    this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
                    this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
                    this.Controls.Add(this.button1);
                    this.Name = "myUC";
                    this.Size = new System.Drawing.Size(241, 199);
                    this.ResumeLayout(false);
        
                }
        
                #endregion
        
                private System.Windows.Forms.Button button1;
            }





        -
        Edité par LilyKianii 16 novembre 2018 à 18:20:45

        • Partager sur Facebook
        • Partager sur Twitter
          17 novembre 2018 à 11:36:03

          Merci :D ! Je pense avoir compris le code et son fonctionnement, mais j'avoue que je ne sais pas ce qu'est un delegate :o. Mais merci pour l'aide c'est cool !
          • Partager sur Facebook
          • Partager sur Twitter
          ~(‾▿‾~)
            18 novembre 2018 à 1:31:34

            Kiki San a écrit:

            mais j'avoue que je ne sais pas ce qu'est un delegate :o

            Un delegate te permet d'encapsuler une fonction. De "l'exporter" si tu préfères (enfin, dans l'autre sens plus exactement : d'y faire référence.)

            Lorsque tu déclenches ton delegate, il sait qu'il doit aller chercher la fonction X qui se trouve, dans notre cas, dans le form.

            • Partager sur Facebook
            • Partager sur Twitter
              18 novembre 2018 à 17:26:27

              D'accord je pense avoir compris, merci ! Mais une dernière chose, est-ce que dans ce code ça veut dire que l'instance de la Form et l'instance du UserControll sont liées ?
              • Partager sur Facebook
              • Partager sur Twitter
              ~(‾▿‾~)
                18 novembre 2018 à 20:58:31

                Kiki San a écrit:

                D'accord je pense avoir compris, merci ! Mais une dernière chose, est-ce que dans ce code ça veut dire que l'instance de la Form et l'instance du UserControll sont liées ?

                Je ne suis pas sûre de comprendre ce que tu veux dire par "liées"... ni même d'avoir les connaissances nécessaires pour rentrer dans les détails

                Disons que la class myUC contient un membre delegate. Et le Form contient une instance de myUC. Donc ... oui en quelque sorte.

                l'instance de myUC est membre du Form.

                Parcontre, le delegate n'a rien à voir avec ça. C'est simplement un event comme celui que tu peux avoir sur tes boutons.

                Le form déclare un objet myUC (dans le designer)

                private myUC m_userControl;

                A partir de cet objet, on peut accéder à ses membres (au même titre que si le delegate était une fonction/un event quelconque de la classe myUC)

                 m_userControl.Btn_Clicked += new myUC.BtnClick(newForm_Btn_Clicked);

                Étant donné que c'est cette même instance de myUC qui est affiché (et donc qui contient le bouton sur lequel tu appuies)

                this.Controls.Add(this.m_userControl); // --> Add userControl au Form

                ... rien d'anormal à ce qu'il puisse "intervenir" sur ton Form.

                Ce n'est pas plus différent que si l'on avait un Form qui accède à une simple variable dans le userControl. Je suppose ?



                • Partager sur Facebook
                • Partager sur Twitter
                  18 novembre 2018 à 22:29:41

                  D'accord, je pense que ça répond à ma question.

                  Du coup je vais continuer mes tests, et évidemment merci pour ton aide ^^

                  • Partager sur Facebook
                  • Partager sur Twitter
                  ~(‾▿‾~)

                  Interagir avec une WindowsForm via un UserControl

                  × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                  × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                  • Editeur
                  • Markdown