47 votes

Exposer les événements du contrôle sous-jacent

J'ai une zone de liste déroulante dans un contrôle personnalisé. Comment puis-je exposer des événements spécifiques de celui-ci tels que SelectedIndexChanged ou KeyPress, etc. à toute personne / chose implémentant mon contrôle personnalisé?

93voto

SLaks Points 391154

Vous pouvez transférer les événements comme ceci:

     public event EventHandler SelectedIndexChanged 
    {
        add { inner.SelectedIndexChanged += value; }
        remove { inner.SelectedIndexChanged -= value; }
    }
 

4voto

Adam Houldsworth Points 38632

Vous devrez les coder vous-même dans le contrôle - le contrôle utilisateur ne promeut pas automatiquement les événements de ses contrôles enfants. Vous pouvez ensuite interconnecter votre contrôle réel à l'événement promu du contrôle utilisateur:

         public event EventHandler SelectedIndexChanged;

        private void OnSelectedIndexChanged(object sender, EventArgs e)
        {
            if (SelectedIndexChanged != null)
                SelectedIndexChanged(sender, e);
        }

        public UserControl1()
        {
            InitializeComponent();

            cb.SelectedIndexChanged += new EventHandler(OnSelectedIndexChanged);
        }
 

Malheureusement, vous devrez le faire pour chaque événement qui vous intéresse.

2voto

KP. Points 8241

Une solution très simple plutôt que d'avoir des événements personnalisés, serait d'exposer le contrôle imbriqué en tant que propriété du contrôle personnalisé. De là, vous pouvez y attacher très facilement des gestionnaires d'événements. Il n'est pas toujours conseillé d'exposer les contrôles enfants, mais selon le type de contrôle et la façon dont vous l'utilisez, cela peut fonctionner.

 //create an instance of my control
MyCustomControl controlInstance = new MyCustomControl();

//attach and event handler to the exposed subcontrol
controlInstance.SaveButton.Click += new EventHandler(SaveButton_Click);
 

1voto

Ukyuu Points 15

Il existe une autre façon de gérer cela via le concepteur:

Sur le concepteur, dans votre contrôle personnalisé, sur la propriété de la zone de liste déroulante sous "Conception" définissez "Modificateurs" sur interne.

Ensuite, là où vous devez faire quelque chose, ajoutez:

 CustControlName.YourCombo.SelectedIndexChanged += YourCombo_SelectedIndexChanged;
 

de même que :

 private void YourCombo_SelectedIndexChanged(object sender, EventArgs e)
{ 
    // Code to execute when the SelectedIndexIsChanged goes here
}
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X