OVH Cloud OVH Cloud

contrôle hérité : redéfinition ou gestion d'événement ?

1 réponse
Avatar
ThierryP
Je crée une classe "Cl" qui hérite d'un contrôle windows.
Quelle est la bonne pratique si par exemple il s'agit d'un TextBox et que je
souhaite contrôler l'appuie sur une touche, 1 ou 2 ?

1- redéfinir OnKeypress : protected override void
Cl_OnKeyPress(KeyPressEventArgs e)

2- crée un gestionnaire d'événement Cl_KeyPressed :
private void Cl_KeyPress(object sender,
System.Windows.Forms.KeyPressEventArgs e)

De plus qu'est-ce que cela implique que je dispose de "sender" dans le cas 2
et pas dans le cas 1 ?
Merci.

1 réponse

Avatar
Boris Sargos
Salut Thierry,

sans doute possible, la première solution, sans oublier de rajouter dans
le corps de la fonction la ligne suivante:

protected void Cl_OnKeyPress(KeyPressEventArgs e) {
...
base.OnKeyPress(e);
}

Cette ligne est importante, car elle permet entre autres de continuer le
processus de capture d'évènements KeyPress sur d'autres clients. Pour
comprendre ce que je veux dire, rappelle-toi que les évènements sont
avant tout des délégués multicast.
En particulier, imagine que tu aies créé une instance myC1 de ton objet
C1, et plusieurs références de myC1 dans plusieurs classes
indépendantes. Dans les classes qui contiennent une référence à myC1, tu
dois avoir une ligne du genre :

myC1.KeyPress += new EventHandler(...)

Le symbole += signifie que tu ne fais qu'ajouter un "client" à ton
évènement KeyPress. Ainsi, lorsque l'utilisateur appuie sur une touche,
un message Windows est envoyé à myC1, matérialisé sous la forme d'une
fonction : C1_KeyPress(KeyPressEventArgs e).
Par le processus d'héritage, la fonction
Control.KeyPress(KeyPressEventArgs e) est court-circuitée et n'est pas
appellée, alors que c'est elle qui gère d'habitude cet évènement, et
informe chacun de ses "clients" de l'évènement.
Donc, si elle ne peut pas le faire, c'est à toi de le faire. Le plus
simple est alors d'appeller directement le gestionnaire par la méthode
de la classe de base :

base.OnKeyPress(...);

Ok ?