IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB.NET Discussion :

Drag'n Drop sur listView


Sujet :

VB.NET

  1. #1
    Membre très actif Avatar de The_Big_Lebowski
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2009
    Messages
    225
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2009
    Messages : 225
    Par défaut Drag'n Drop sur listView
    Bonjour, je suis confronté à une récupération d'information plutôt bizzare lorsque je dragOver sur une listView.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
        Private Sub LV_DragOver(ByVal sender As Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles LV.DragOver
            Dim LViArrivee As ListViewItem = LV.GetItemAt(e.X, e.Y)
            LViArrivee.Selected = True
            Me.Text = LViArrivee.Text
        End Sub
    Je drag un treenode, l'evenement itemDrag se passe correctement, je recupere bien l'info.

    Le probleme est rencontré lorsque je dragOver sur ma listview.
    Pour debugger, je sélectionne le listviewItem qui est remonté par la methode GetItemAt(x,y) et là, je m'aperçois que l'item qui se sélectionne n'est pas le bon, il y a un décalage au niveau de la sélection. En effet, le listviewItem sélectionné est positionné 6 items au dessous de celui qui est survolé.
    C'est à n'y rien comprendre.
    Merci de votre aide.

  2. #2
    Membre très actif Avatar de The_Big_Lebowski
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2009
    Messages
    225
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2009
    Messages : 225
    Par défaut
    J'ai des infos supplémentaires
    J'ai l'impression que les coordonnées renvoyées par l’évènement ne sont pas en rapport avec la listview mais bien par rapport au winForm conteneur.
    Le décalage de sélection est identique à la distance qui se trouve entre le haut de mon winForm et le haut de la listview.
    Comment puis-je récupérer les bonnes coordonnées X et Y ?

  3. #3
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Citation Envoyé par The_Big_Lebowski Voir le message
    Comment puis-je récupérer les bonnes coordonnées X et Y ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Dim pf As Point = ...
    Dim ps As Point = Me.PointToScreen(pf)
    Dim pl As Point = listBox1.PointToClient(ps)
    (avec pf les coordonnées relatives à la Form, ps les coordonnées absolues (relatives à l'écran), et pl les coordonnées relatives à la ListBox)

  4. #4
    Membre très actif Avatar de The_Big_Lebowski
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2009
    Messages
    225
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2009
    Messages : 225
    Par défaut
    L'venement dragOver de la listview me remonte les coordonnées x et y du pointeur.
    La methode LV.GetItemAt(pl.X, pl.Y) doit théoriquement me retourner le listviewitem sous le pointeur.

    Comment se fait-il que les coordonnées x et y retournées par l'évènement ne soient pas pointToClient de la listview ?

    Quand j'affiche les coordonnées de mon pointeur, elles sont relatives à mon winForm.
    Dans mon dragOver, le pointToClient de ma listView me donne les mêmes informations que LV.pointToClient.
    En trichant,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    LViArrivee = LV.GetItemAt(e.X, e.Y - (LV.Top + 21))
    Je tombe bon, c'est bizarre
    est ce que je n'aurais pas oublié d'assigner une valeur à une propriété de la listview ou de mon form ?

  5. #5
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Selon la doc, le X et le Y de l'évènement sont toujours en coordonnées écran :

    The X and Y properties of the DragEventArgs are in screen coordinates, not client coordinates. The following line of C# code converts the properties to a client Point:

    Point clientPoint = targetControl.PointToClient(new Point(de.X, de.Y));
    Faut lire la doc, ça évite de perdre du temps

  6. #6
    Membre très actif Avatar de The_Big_Lebowski
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2009
    Messages
    225
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2009
    Messages : 225
    Par défaut

    ca fait des heures que je me tire les cheveux la dessus.
    Super ca marche.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
            Dim LViArrivee As ListViewItem
            Dim ClientPoint As Point = LV.PointToClient(New Point(e.X, e.Y))
            LViArrivee = LV.GetItemAt(ClientPoint.X, ClientPoint.Y)
            LViArrivee.Selected = True
    Merci tomlev pour l'info, je ne me ferai plus avoir.

    Il est temps de buller un peu devant un bon film.
    Bonne nuit et encore merci.
    Faut lire la doc, ça évite de perdre du temps
    J'ai lu pas mal de truc sans pour autant mettre le nez dessus. convaincu qu'une propriété mal renseignée sur mon form me créait des anomalies. Comme quoi ...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Drag and drop sur une PictureBox
    Par abdiouldbody dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 17/06/2009, 15h55
  2. drag and drop sur une listBox?
    Par Mickey.jet dans le forum Delphi
    Réponses: 3
    Dernier message: 30/09/2006, 10h27
  3. Drag and drop sur du text ?
    Par isa150183 dans le forum JSF
    Réponses: 2
    Dernier message: 05/07/2006, 06h28
  4. [FLASH 8] Drag'n'Drop sur Textfield ???
    Par Begood dans le forum Flash
    Réponses: 5
    Dernier message: 28/03/2006, 11h15
  5. Drag and drop sur un JTree
    Par tomca dans le forum Composants
    Réponses: 4
    Dernier message: 02/08/2005, 10h54

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo