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é?
Réponses
Trop de publicités?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.
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);
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
}