J'ai une zone de liste déroulante dans un contrôle personnalisé. Comment puis-je exposer des événements spécifiques tels que SelectedIndexChanged ou KeyPress, etc à quelqu'un/chose mettant en œuvre mon contrôle personnalisé?Affichage des événements du contrôle sous-jacent
Répondre
Vous pouvez transférer les événements comme celui-ci.:
public event EventHandler SelectedIndexChanged
{
add { inner.SelectedIndexChanged += value; }
remove { inner.SelectedIndexChanged -= value; }
}
Vous devrez les coder dans le contrôle vous-même - le contrôle utilisateur ne fait pas automatiquement la promotion des événements de ses contrôles enfants. Vous pouvez ensuite contre-fil de votre commande réelle à l'événement promu du contrôle de l'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 que vous êtes intéressé par
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 attacher des gestionnaires d'événements très facilement. Il n'est pas toujours conseillé d'exposer les contrôles enfants, mais en fonction du type de contrôle et de 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);
Ceci n'est pas incorrect, mais pour les lecteurs qui ne connaissent pas bien la création de contrôles utilisateur personnalisés, notez que La raison pour laquelle il n'est pas conseillé d'exposer les contrôles enfants est qu'il va à l'encontre de la finalité de l'encapsulation d'une fonctionnalité complète dans un contrôle utilisateur. En exposant un contrôle enfant entier, vous encouragez en fait le consommateur du contrôle utilisateur à manipuler directement le contrôle enfant. Au lieu de cela, essayez d'exposer le ou les deux événements absolument nécessaires par les consommateurs de votre contrôle utilisateur, plutôt que le contrôle enfant entier. – CobaltBlue
Il y a une autre façon de gérer que par le concepteur:
Sur le concepteur, dans votre contrôle personnalisé, sur la propriété combobox sous « Design » set « Modificateurs » à interne.
Alors, où vous devez faire quelque chose ajouter:
CustControlName.YourCombo.SelectedIndexChanged += YourCombo_SelectedIndexChanged;
avec:
private void YourCombo_SelectedIndexChanged(object sender, EventArgs e)
{
// Code to execute when the SelectedIndexIsChanged goes here
}
fonctionne un peu plus commodément, mais toujours sous réserve de forme de commentaire CobaltBlue – gg89
- 1. Affichage du calendrier Contrôle
- 2. Affichage de la conception pour les événements de contrôle utilisateur
- 3. Contrôle des événements mousewheel flash
- 4. Suivi des événements d'un contrôle
- 5. Contrôle des événements dans flex as3 (ordre des événements)
- 6. Ordre des événements de contrôle du serveur ASP .Net
- 7. Affichage contrôle des méthodes En modèle
- 8. événements de contrôle des enfants à l'intérieur contrôle personnalisé
- 9. Contrôle Silverlight Désactiver/Supprimer des événements
- 10. jQuery: Contrôle de l'ordre des événements
- 11. Événements de contrôle retardés
- 12. Affichage des événements d'éléments DOM et leurs gestionnaires
- 13. Affichage du calendrier complet
- 14. Événements de contrôle utilisateur
- 15. Capture des événements du navigateur
- 16. Signification du journal des événements?
- 17. Affichage liste Affichage des images
- 18. Affichage de l'infobulle du contrôle WPF sous les touches décisives
- 19. Sharepoint - Affichage des événements du calendrier dans plusieurs calendriers dans les différents sous-sites
- 20. Asp.net Page et contrôle Événements
- 21. Abonnez-vous aux événements du bouton dans un contrôle personnalisé
- 22. Événements sur les contrôles dans le contrôle du serveur Web
- 23. Affichage du contrôle d'étiquette en fonction de la condition
- 24. Affichage visuel du tri dans un contrôle ListView
- 25. Routage des événements de clé vers un autre contrôle
- 26. Affichage des icônes dans le contrôle d'arbre Struts2-dojo
- 27. Gestion des événements pour le contrôle ActiveX créé dynamiquement
- 28. Gestion des événements de touche sur le contrôle WebBrowser
- 29. Suppression des vues du sous-affichage
- 30. Android: Affichage des événements à la file d'attente des messages de View
belle, ne savait pas si la syntaxe est disponible pour des événements en C#. Vous pouvez donc y ajouter des effets secondaires pour l'assignation et la suppression des gestionnaires d'événements (par exemple si vous voulez les gérer vous-même ou faire quelque chose avec COM ou du code natif ou même avec du matériel) –
faire attention à cela car l'expéditeur de l'événement n'est pas le contrôle externe mais l'interne. Cela pourrait être l'intension, mais il y a des cas où cela pourrait être indésirable. – GDS
cela peut fonctionner correctement pour SelectedIndexChanged d'une liste déroulante, mais prend un peu plus de code pour travailler pour un autre événement comme CheckedChanged d'une case à cocher. En utilisant le code similaire à celui ci-dessus vous obtiendrez une syntaxe proche de la valeur alors que la réponse n ° 2 peut mieux fonctionner pour de tels cas. – gg89