none
passer l'événement clic au contrôle parent RRS feed

  • Question

  • Bonjour

    J'ai créé un UserControl qui est une sorte de méga bouton (avec images, textes etc.). Quand l'utilisateur clique sur le méga bouton je souhaite recevoir un événement Click() dans le Form parent.

    Pour le moment, j'ai ajouté un handler d'événement Click() dans le parent, et il n'est pas appelé.

    J'ai donc essayé de créer un handler d'événement Click() dans mon usercontrol (sur l'image principale par exemple), celui-là est appelé. Mais une fois là, comment lancer l'événement clic au parent pour que le form soit appelé :

    Le méga bouton :

      public partial class HomeButton : UserControl
      {
        private void butimg_Click(object sender,EventArgs ev)
        {
          //ici lancer le click pour le parent
        }
      }

    Le Form dans lequel se trouve le méga bouton :

        private void memberbut_Click(object sender,EventArgs ev)
        {
            // n'est pas appelé
        }

    Je ne souhaite pas créer d'événement spécifique dans HomeButton (j'ai vu plein d'exemples de délégate etc.) car l'événement clic est déjà disponible ici, inutile d'en rajouter. Je veux juste le lancer.

    En flash on aurait fait quelque chose comme ça:

    var evt=new MouseEvent(..)
    DispatchEvent(evt)

    En C++ on trouve des "PropagateEvent()" etc., mais je ne trouve pas la fonction en c#.net 3.5

    Merci

    lundi 18 octobre 2010 09:04

Réponses

  • Comme proprosé si vous ne voulez pas ajouter un évènement vous pouvez toujours rendre public le bouton au sein de votre user control.

    Il vous suffit alors d'abonner la méthode click() de votre parent à l'event existant su le bouton

    HomeButton.Button.Click += memberbut_Click;

    Une autre possibilité et de passer une référence au parent ou à la méthode click du parent au sein du user control. Dans ce cas votre problème sera bien de vous assurez que la méthode memberbut_Click existe pour tous les parents. 

    Nénamoins dans tous les cas la solution d'exposer un event publique me semble meilleure car il suffit d'abonner votre méthode à l'évènement. Cela fonctionne quelque soit le parent et que l'évènement click provienne ou non du bouton.

    Cordialement

    • Marqué comme réponse Alex Petrescu jeudi 4 novembre 2010 09:27
    mercredi 3 novembre 2010 11:03
    Modérateur

Toutes les réponses

  • Bonjour,

     

    Je connais pas très bien le C++ mais je dirait que j'essairais avec PerformClic

     

    A bientôt


    Cordialement, Troxsa
    • Proposé comme réponse Troxsa lundi 18 octobre 2010 09:33
    • Non proposé comme réponse Riccardo Cohen lundi 18 octobre 2010 09:39
    lundi 18 octobre 2010 09:28
  • la fonction PerformClic n'est pas dispo dans un UserControl
    Ici je suis en C# bien sûr, j'ai donné l'exemple de flash et c++ que je connais, mais le projet actuel est en c#

    Merci

    lundi 18 octobre 2010 09:41
  • Bonjour,

    Effectivement cela semble plus ardu dans le langage C#, j'ai regardé sur le net sur différent site mais rien trouvé de bien ...
    En VB.net c'est très facile a faire, j'ai essayé de convertir le code fais en Vb.net vers C# a partir de plusieurs site de conversion mais rien de fonctionnel en C#

    Faudra attendre d"autre réponse d'autre car je suis pas assez callé en C# dsl

     

    A bientot


    Cordialement, Troxsa
    mardi 19 octobre 2010 18:13
  • merci d'avoir essayé, en attendant  je mets un classique délégate
    mardi 19 octobre 2010 18:23
  • Bonjour,

    la solution est bien de déclarer un event public dans votre user control. Le but de cet event est bien de remonter l'evènement au control parent c'est pourquoi on parle souvent de Bubble event. IL serait possible de s'abonner directement au click sur le boutton du user control en l'exposant publiquement.Néanmoins cette solution n'est pas recommandée (principe d'encapsulation)

    Il suffit ensuite d'abonner votre méthode memberbut_Click à l'event publique du user control.

    Vous pouvez trouver un exemple complet ici

    Cordialement

    • Marqué comme réponse Alex Petrescu lundi 25 octobre 2010 14:05
    • Non marqué comme réponse Riccardo Cohen vendredi 29 octobre 2010 13:00
    mercredi 20 octobre 2010 08:43
    Modérateur
  • Bonjour,

     

    M. Cohen, est-ce que vous avez réussi avec la solution proposée par Nikho ?

     

    Cordialement,

    Alex

     

    ________________

    Publiez un article sur une de ces technologies : Visual Basic, C#, C++, .NET, ASP.NET, SQL Server, Silverlight, SharePoint 2010, SharePoint 2007

    Windows Phone 7

    Astuces pour Visual Studio 2010

    XNA – Développement jeux vidéo

    Didacticiels et astuces : VB.NET, C#, ASP.NET, .NET Framework, Silverlight, Workflow Foundation, WPF

    Café des usages

    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.

     

     

    jeudi 21 octobre 2010 09:58
  • je comprends la solution mais il s'agit justement de ce que je ne veux pas faire : ajouter un événement personnalisé.

    Je voudrais appeler Click(this,ev) directement et non BubbleClick(this,ev), vu que l'appelant attend un événement Click() pourquoi créer un événement personnalisé ?

    Merci

     

    vendredi 29 octobre 2010 13:04
  • Comme proprosé si vous ne voulez pas ajouter un évènement vous pouvez toujours rendre public le bouton au sein de votre user control.

    Il vous suffit alors d'abonner la méthode click() de votre parent à l'event existant su le bouton

    HomeButton.Button.Click += memberbut_Click;

    Une autre possibilité et de passer une référence au parent ou à la méthode click du parent au sein du user control. Dans ce cas votre problème sera bien de vous assurez que la méthode memberbut_Click existe pour tous les parents. 

    Nénamoins dans tous les cas la solution d'exposer un event publique me semble meilleure car il suffit d'abonner votre méthode à l'évènement. Cela fonctionne quelque soit le parent et que l'évènement click provienne ou non du bouton.

    Cordialement

    • Marqué comme réponse Alex Petrescu jeudi 4 novembre 2010 09:27
    mercredi 3 novembre 2010 11:03
    Modérateur
  • Ok et merci pour tous ces éclaircissements.

    Je comprends que je ne peux définitivement pas lancer l'événement Click() (alors que le framework peut le faire, lui... sur action de la souris), et c'est bien dommage... mais disons que les solutions de contournement sont tout à fait acceptables. J'ai implémenté l'évent personnalisé et je vais donc rester sur cette solution.

    Merci beaucoup.

    mardi 9 novembre 2010 11:03