Bonjour,
Je voudrais obtenir le code de la touche pressée dans un textbox (sans utiliser 'e As KeyEventArgs').
J'ai trouvé un exemple avec DIRECTCAST/CTYPE mais ça ne fonctionne pas, pourtant à l'"arrêt sur la faute", le curseur sur 'e' me donne bien le code de la touche pressée.
Private Sub TextBox1_Changed(sender As Object, e As EventArgs) Handles TextBox1.TextChanged
Dim tmp As KeyPressEventArgs = DirectCast(e, KeyPressEventArgs)
MessageBox.Show(tmp.KeyChar)
End Sub
Bonjour
Le code à la rubrique 10 est avec Textbox1.KeyPress et non avec Textbox1.Changed .
De plus vous avez pressé la touche 0 du pavé numérique . Faites le avec la touche 0 avec shift ( au-dessus des lettres O et P ) et vous n'aurez pas le même résultat .
Code modifié par moi car 'e' est un EventArgs, je l'ai donc casté ainsi :
Dim tmp As KeyPressEventArgs = CType(e, KeyPressEventArgs)
, comme le proposé par VBNET.
VB NET vous l'a sûrement proposé mais cela ne peut fonctionner . KeyPressEventArgs et EventArgs ne sont pas interchangeables entre les contrôles . Ils sont définis pour des évènements bien particuliers aux contrôles ( voir le réponse de Whismeril que je salue ) .
L’événement Changed n’envoie pas les mêmes informations que les événements keydown, keypress et keyup. C’est d’ailleurs pour ça que e n’a pas le même type.
En plus
changed n’est pas déclenché que lors d’une saisie au clavier mais aussi lors d’un changement via le code, un copier coller à la souris, un drag and drop, etc...
quand il est déclenché par le clavier cela arrive après que la touche soit relâchée
Bref, à brule pourpoint c’est pas gagné.
Peux tu expliquer plus en détails ton besoin pour voir quelles solutions appliquer
Bonjour
Pouvez-vous nous dire où vous avez trouvé cet exemple et nous le montrer si possible ?
Car moi en lançant votre code j'ai une belle erreur sur
Dim tmp As KeyPressEventArgs = DirectCast(e, KeyPressEventArgs)
et je ne vois aucun code au niveau du e .
J'utilise Visual Studio Net Community 2019 qui contient VB Net 2019 .
De toute façon l'erreur est inévitable dans votre code .
Remarquez que la signature de l'évènement contient
e As EventArgs
ce qui montre que l'on ne peut pas dans ce cas obtenir le caractère tapé .
Il faut utiliser
Private Sub Textbox1_KeyPress(sender As Object, e As KeyPressEventArgs) Handles Textbox1.KeyPress
Dans ce cas e.Keychar contient le caractère tapé au clavier .
e contient des paramètres produits par l'évènement .
Dim tmp As System.Windows.Forms.KeyPressEventArgs = e
Code modifié par moi car 'e' est un EventArgs, je l'ai donc casté ainsi :
Dim tmp As KeyPressEventArgs = CType(e, KeyPressEventArgs)
, comme le proposé par VBNET.
Mais l'erreur vient probablement du fait que mon Handle n'est pas un KeyPress.
NÉANMOINS, je peux voir la valeur de la touche via l'Info-Bulle (j'ai pressé zéro).
J'ai fait une copie d'écran ci-après.
Je n'ai jamais dit que c'était impossible.
Je t'ai demandé de détailler ton besoin, ce que tu n'as pas fait.
Tout à l'heure, je n'avais pas le temps de faire une explication plus complète.
On va commencer par quelques notions sur l'héritage.
La programmation objet est très largement inspirée de la vraie vie, notamment sur l'héritage (je ne parle pas de succession hein....)
Une adolescente est une humaine. Un quadragénaire est un humain. Une grand-mère est une humaine. Un ouvrier est un humain, une institutrice est une humaine. Etc...
Donc dans une variable de type Humain, on peut mettre des instances de Adolescente, de Quadragénaire etc...
Ça a un certain nombre d'avantages, mais cela a aussi pour inconvénient majeur qu'on ne peut pas accéder aux spécificités de chaque type depuis une variable Humain. Pour cela il faut caster dans le type d'origine
Dim humain as Humain = new Adolescente()
'....
Dim adolescente = DirectCast(humain, Adolescente)
fonctionne très bien.
Là où ça ne va pas marcher, c'est si on a mis un ouvrier (par exemple) dans la variable humain. Pire, si on a mis un Humain dans humain, on ne pourra le caster en rien d'autre, enfin rien d'autre "en dessous".
Car Humain hérite de Mammifère, on pourra donc caster la variable humain en Mammifère. Mais si on a mis un Chat dans une variable de type Mammifère on ne pourra pas la caster en Humain.
C'est donc pour ça que la variable sender est toujours du type Object dans les contrôles de Microsoft, car Object c'est la mère de toutes les classes. Tous, absolument tous les types en .Net héritent plus ou moins directement de Object.
Ça permet, par exemple, de n'écrire qu'un code qui gère l'évènement Click de textbox, de labels, de boutons et de je ne sais quoi
Et quand on veut utiliser les spécificités du type initial de sender, il faut le caster judicieusement.
Revenons maintenant plus précisément à ton problème.
Ton premier code montre la signature d'un évènement Change, qu'on pourrait associer avec un évènement KeyPress ou KeyDown, parce que l'argument sender est quoi qu'il arrive de type Object et que les "e" de KeyPress et de KeyDown (bien que de types différents) dévirent tous les 2 de EventsArg.
Donc, si et seulement si
on a associé un évènement Keydown ou Keypress à une méthode ayant la signature d'un évènement Change
on a vérifié que le changement est bien dû à la pression d'une touche
on a vérifié si ça vient d'un KeyDown ou d'un Keypress (en fait on peut fusionner avec la condition au-dessus mais j'ai écrit 2 conditions pour bien détailler)
On peut caster, avec le type qui va bien.
Parce que là ton message te dit clairement, que tu veux caster un e qui vient d'un KeyDown comme s'il venait d'un KeyPress.....
Quand on ne maitrise pas toutes ces subtilités, le plus simple c'est d'associer
un évènement KeyPress à une méthode avec la signature normale pour un KeyPress
un évènement KeyDown à une méthode avec la signature normale pour un KeyDown
un évènement Change à une méthode avec la signature normale pour un Change
Maintenant, si tu veux absolument "mélanger" ça peut s'envisager, à condition que tu détailles ton besoin
EDIT orthohraphe
Quand j'étais petit, la mer Morte n'était que malade.
George Burns
non, la doc en ligne peut être trompeuse, en .Net 5.0 (celle affichée par défaut aujourd'hui) et selon le contrôle ça peut être KeyEventArgs pour les 2