none
Delegate et UserControl RRS feed

  • Question

  • Bonjour,

    voici mon problème. 
    J'ai mon Form1 qui est l'application principale.
    J'ai créé un UserControl que j'ai intégré dans un Form2(StartIcones) et qui permet à l'utilisateur de faire un choix entre 3 rubriques. Ces rubriques sont symbolisées par des icônes.

    Je voudrais que mon Form1 récupère le choix fait par l'utilisateur.
    j'ai donc utilisé un delegate et un event.

    Si je n'utilise pas de UserControl et fais mon design directement dans mon Form2, pas de problème je récupère correctement le choix de l'utilisateur.
    Mais.. dans le cas d'un UserControl importé dans le Form2(StartIcones) cela ne fonctionne plus.
    Le Form1 ne récupère plus le choix fait dans le Form2(UserControl)
    J'ai mis mon delegate et mon event directement dans le code behind de mon UserControl. Ce qui donne ceci:

    public delegate void EChoixApplication(string reponse);
    
        public partial class UCMenuPanel : UserControl
        {
            public event EChoixApplication monEvent;
    
            public UCMenuPanel()
            {
                InitializeComponent();
            }
    
            // => Bouton Caisse
            public void PCTBCaisse_Click(object sender, EventArgs e)
            {
                if (monEvent != null)
                { 
                    monEvent(string.Format("{0}", PCTBCaisse.Tag));
                    //this.Form.Close();
                }
            }
    
            // => Bouton Compta
            public void PCTBCompta_Click(object sender, EventArgs e)
            {
                if (monEvent != null)
                {
                    monEvent(string.Format("{0}", PCTBCompta.Tag));
                    //this.Form.Close();
                }
            }
    
            // => Bouton Administration
            public void PCTBAdmin_Click(object sender, EventArgs e)
            {
                if (monEvent != null)
                {
                    monEvent(string.Format("{0}", PCTBAdmin.Tag));
                    //this.Form.Close();
                }
            }
    
    
        }

    Dans mon Form2 (StartIcone) j'ai :

     public partial class StartIcones : Form
        {
            public UCMenuPanel UserChoise;
    
            public StartIcones()
            {
                InitializeComponent();
                UserChoise = new UCMenuPanel();
            }
    
        }

    et dans mon Form1 (application principale) j'ai:

     public partial class Form1 : Form
        {
            Employe E;
    
            public Form1()
            {
                InitializeComponent();
    
            
                StartIcones i = new StartIcones();
    
                i.Show();
                i.UserChoice.monEvent += new EChoixApplication(ChoixApplication);     
            }
    
            public void ChoixApplication(string reponse)
            {
                textBox1.Text = reponse;
            }
        }

    Auriez-vous une idée comment faire?

    vendredi 30 novembre 2012 15:07

Réponses

Toutes les réponses

  • Bonjour,

    Votre événement ne sera accessible que dans le form2 et pas dans le form1. Si vous souhaitez le rendre accessible au form1, il faut créer le delegate et event sur le form2.


    Merci de valider par "Proposer comme réponse" si celle-ci répond à votre demande !

    vendredi 30 novembre 2012 15:43
  • Bonjour Lyamine,

    merci pour votre réponse.

    Si je créé le delegate et event dans le Form 2, je n'ai pas accès aux boutons(icones) du UserControl(UCMenuPanel).

    Comment faire alors ?

    vendredi 30 novembre 2012 15:47
  • Il faut faire l'event qui est dans le Form1 coté Form2 pour intercepter le bouton cliqué, puis déclarer dans le form2 un nouveau delegate event comme fait dans le user control.

    Merci de valider par "Proposer comme réponse" si celle-ci répond à votre demande !

    vendredi 30 novembre 2012 16:31
  • Si je comprends bien j'aurai :

    - Pas de ligne de code dans mon UserControl

    - Dans mon Form 2

    Je déclare un premier delegate avec un event

     public delegate void EChoixApplication(string reponse);
    
     public event EChoixApplication monEvent;

    La gestion de mes boutons comme ceci : avec l'event du FORM1 déplacé dans le FORM2

             UCMenuPanel m = new UCMenuPanel();
             StartIcones i = new StartIcones();
            //public UCMenuPanel UserChoise;
    
            public StartIcones()
            {
                InitializeComponent();
                i.monEvent += new StartIcones.EChoixApplication(ChoixApplication);
            }
    
    
            // => Bouton Caisse
            public void PCTBCaisse_Click(object sender, EventArgs e)
            {
                if (monEvent != null)
                {
                    monEvent(string.Format("{0}", m.PCTBCaisse.Tag));
                    //this.Form.Close();
                }
            }
    
            // => Bouton Compta
            public void PCTBCompta_Click(object sender, EventArgs e)
            {
                if (monEvent != null)
                {
                    monEvent(string.Format("{0}", m.PCTBCompta.Tag));
                    //this.Form.Close();
                }
            }
    
            // => Bouton Administration
            public void PCTBAdmin_Click(object sender, EventArgs e)
            {
                if (monEvent != null)
                {
                    monEvent(string.Format("{0}", m.PCTBAdmin.Tag));
                    //this.Form.Close();
                }
            }

    ma fonction ChoixApplication

     public void ChoixApplication(string reponse)
            {
                textBox1.Text = reponse;
            }

    mais dans ce cas, je n'ai pas accès à mon textBox1.Text puisqu'il est dans FORM1

    Et toujours dans le FORM2 créer un nouveau delegate et event.

    Mais je ne vois pas très bien comment récupérer le choix dans le FORM1? 

    Que prendra ce nouveau delegate et son event ?



    • Modifié paintbox00 vendredi 30 novembre 2012 16:59
    vendredi 30 novembre 2012 16:43
  • Alors je viens de faire le test, j'ai ajouter mon contrôle utilisateur dans le form2.

    J'ai rendu son Modifier à public (voir propriété dans le contrôle du form2) puis fait comme votre code du 1er post et cela fonctionne.

    Je vous fais part du code source :

    https://skydrive.live.com/redir?resid=11D26A7936907971!159&authkey=!AH0BdDBR0jg92j4

     

    Cordialement


    Merci de valider par "Proposer comme réponse" si celle-ci répond à votre demande !

    • Marqué comme réponse paintbox00 lundi 3 décembre 2012 19:21
    vendredi 30 novembre 2012 17:18
  • Ca correspond en effet à ce que je cherche à faire. Je vais le tester sur mon projet mais je vais devoir le recommencer parce qu'à force de changer, j'ai des soucis. Je vais donc repartir sur un code propre.

    Je vous tiens au courant.
    Merci

     
    vendredi 30 novembre 2012 17:54
  • Bonjour,

    Est-ce que vous avez testé les solutions proposées ? Merci de partager avec nous les résultats, afin que d'autres personnes avec le même problème puissent profiter de cette solution.

    Cordialement,

    Aurel

    Aurel BERA, Microsoft
    Microsoft propose ce service gratuitement, dans le but d'aider les utilisateurs et d'élargir les connaissances générales liées aux produits et technologies Microsoft. Ce contenu est fourni "tel quel" et il n'implique aucune responsabilité de la part de Microsoft.

    lundi 3 décembre 2012 09:20
  • Bonjour,

    En lisant vos différentes questions, j'ai envie de vous conseiller de jeter un coup d'oeil sur les principes de la Programmation Orientée Objet et de la Programmation tout cours, Vous y trouverez pas mal de réponses définitives à vos questions.

    Bien que vous soyez dans le contexte d'une application Windwsforms (Form, Control, ...), vos questions relèvent plus des concepts de la programmation (classe, instance, propriété, méthode, communication entre objets, ...) que autres choses.

    Cordialement.





    lundi 3 décembre 2012 16:13
    Auteur de réponse