Gestion double clic sur listview (subclassing)

Soyez le premier à donner votre avis sur cette source.

Vue 9 616 fois - Téléchargée 750 fois

Description

J'ai, il y a quelques jours, rencontré un problème avec une ListView avec la propriété CheckBoxes activée.

Lorsque l'on effectue un double clic sur un item, cela a pour conséquence de modifier l'état de la CheckBox de ce même item. La 2ème conséquence qui en découle est que les évenements ItemCheck et ItemChecked sont également appelés.

Il n'est par ailleurs pas possible de savoir si les évenements ItemCheck ou ItemChecked ont été appelés à la suite d'un double clic car l'évenement DoubleClick ne se produit qu'après les 2 premiers.

Cela devient vite un problème lorsque :
- on souhaite gérer les 2 évenements (DoubleClick et ItemCheck) indépendamment
- on ne souhaite pas que le double clic change l'état de la CheckBox

Après de longues recherches et un post sur le forum CS, je n'ai trouvé aucune réponse satisfaisante. Je me suis donc tourné vers le SubClassing.

Vous trouverez donc ici un exemple illustrant comment isoler les 2 méthodes (ItemCheck et DoubleClick) grâce au SubClassing (en pure .Net)

Codes Sources

A voir également

Ajouter un commentaire Commentaires
Messages postés
40
Date d'inscription
dimanche 23 novembre 2003
Statut
Membre
Dernière intervention
25 juin 2011

Salut!
Intéressant. Grâce à ta source j'ai pu subclasser un column header d'une listview, afin de pouvoir attraper les mousemove ! (impossible normallement à partir de la listview, dès qu'on arrive sur le header les WM_MOUSEMOVE ne se lancent pas)

-----------------

Cependant, je ne comprend pas un de tes points. Peut-être le même que PCPT (?) :

'Renvoi les messages de sous-classement (si on le souhaite)
Protected Overrides Sub WndProc(ByRef m As Message)
If mSubClass Then 'If Subclassing Enabled then RaiseEvent
RaiseEvent CallBackProc(m)
End If
MyBase.WndProc(m) <<<<<<< ICI (?)
End Sub

Pourquoi faire passer en dernier TOUS les messages, même quand tu les a déjà redirigés ? J'aurais plutôt vu un

'Renvoi les messages de sous-classement (si on le souhaite)
Protected Overrides Sub WndProc(ByRef m As Message)
If mSubClass Then 'If Subclassing Enabled then RaiseEvent
RaiseEvent CallBackProc(m)
else
MyBase.WndProc(m) <<<<<<< LA !!
End If
End Sub

Car avec ton code, cela fait donc DOUBLE EMPLOI avec la même commande dans :
Private Sub CallBackProc(ByRef m As System.Windows.Forms.Message)

Je veux dire que tu lance MyBase.WndProc(m) 2x dans le cas ou il était subclassé...

Tiens-moi au courant STP, je ne comprends pas ^^
Merci d'avance!
Messages postés
31
Date d'inscription
mercredi 17 octobre 2007
Statut
Membre
Dernière intervention
16 mars 2009

Excellent. Source très utile et explicite. merci
Messages postés
13280
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
37
beh le premier pas est fait, j'ai installé VS2008 c'est déjà pas mal non? ^^
on verra par la suite, rien ne presse

compris pour le subclass permanent et son appel. tout s'explique ;)
merci

bonne continuation
Messages postés
1411
Date d'inscription
mercredi 6 août 2003
Statut
Membre
Dernière intervention
3 mars 2019
1
"j'sens que je ne vais pas me mettre à dotnet encore un moment"

LOL j'ai fait la même reflexion pendant très longtemps. DotNet est si, DotNet est ça.
En fait, il faut simplement se lancer, faire un premier pas et on se rend compte du temps que l'on peut gagner à programmer en .NET
Depuis que j'y ai gouter, je ne touche plus mon VB6 (juste pour relire d'anciens codes et les porter en .Net)

Sinon, pour répondre à ta question. Je reconnais ne pas avoir été très clair. Plus même je me suis carrement mal exprimé.

La class n'a en fait rien a voir dans le sous-classement de la fenêtre elle-même. Disons que toutes les fenêtres en VB.Net le sont automatiquement.
Et pour récupérer les messages il suffit d'ajouter : Protected Overrides Sub WndProc(ByRef m As Message)
Messages postés
13280
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
37
... en effet je vois pas trop là
je comprends de quoi tu parles mais pas le "pourquoi" dans le fonctionnement

(j'sens que je ne vais pas me mettre à dotnet encore un moment ^^)

tu déclares withevents la class SubClass
tu l'instancies au LOAD avec le handle de la LV, puis active (enabled)

l'instance reçoit bien uniquement les events de la LV non?
puis elle raise TOUT de la LV uniquement

ta form reçoit "CE" TOUT, et tu n'annules que le DBL_CLICK

je ne vois pas comment la form devrait recevoir ses propres évents en ajoutant ta protected sub

tu peux expliquer stp?
Afficher les 8 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.