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

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

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

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

Vous devrez les coder vous-même dans le contrôle – le contrôle utilisateur ne favorise pas automatiquement les événements de ses contrôles enfants. Vous pouvez ensuite relier 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.

Une solution très simple, plutôt que des événements personnalisés, consisterait à exposer le contrôle nested en tant que propriété du contrôle personnalisé. De là, vous pouvez y attacher des gestionnaires d’événements très facilement. Il n’est pas toujours conseillé d’exposer les contrôles enfants, mais selon le type de contrôle et son utilisation, 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); 

Il y a une autre façon de gérer cela à travers le concepteur:

Sur le concepteur, dans votre contrôle personnalisé, sur la propriété combobox sous “Conception”, définissez “Modificateurs” sur interne.

Alors, 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 }