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

Windows Forms Discussion :

Comment connaitre l'objet de départ lors d'un drag & drop


Sujet :

Windows Forms

  1. #1
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2003
    Messages
    194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2003
    Messages : 194
    Points : 118
    Points
    118
    Par défaut Comment connaitre l'objet de départ lors d'un drag & drop
    Bonjour, ma question est un peu difficile à comprendre, je m'explique :
    J'ai créer une classe ListBoxDAD qui hérite de ListBox.
    Pourquoi faire une classe, parceque je souhaite créer des ListBox dynamiquement dans mon application.
    J'ai trouvé un exmple de code qui marche parfaitement à cette adresse : lien mais voilà c'est pas vraiment un drag & drop car cela ne fait que du copier coller d'une ListBox à l'autre.
    Mon problème se situe où je doit supprimer la donnée à un objet connu.

    voilà comment je fais avec des ListBox "en dur" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    private void listBox1_DragDrop(object sender, DragEventArgs e)
    {
          if (e.Data.GetDataPresent(DataFormats.Text))
          {
               this.listBox1.Items.Add((String)(e.Data.GetData(DataFormats.Text)));
               this.listBox2.Items.Remove((String)(e.Data.GetData(DataFormats.Text)));
               this.listBox1.AllowDrop = false;
          }
    }
    Le même pour du dynamique :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    private void OnDragDrop(object sender, DragEventArgs e)
         {
              if(e.Data.GetDataPresent(DataFormats.Text))
              {
                   Items.Add(e.Data.GetData(DataFormats.Text));
                   Items.Remove((e.Data.GetData(DataFormats.Text)); // le problème est là
              }
         }
    Ce qu'il me faudrait c'est connaitre l'objet (ou contrôle) que je doit utiliser pour la suppression de la valeur. Je suppose que je doit utiliser "sender" ou "e" mais j'ai pas trouvé comment récupérer l'objet de départ.

    Merci pour vos réponses.
    Si tout semble bien marcher c'est que vous avez oublié quelque chose !

  2. #2
    Membre éprouvé
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2007
    Messages
    693
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juillet 2007
    Messages : 693
    Points : 1 187
    Points
    1 187
    Par défaut
    Bonjour,

    J'ai fait quelques recherches, apparemment, il n'y a pas moyen nativement de connaître le control source.

    Je te propose un code de mon cru permettant de connaitre le controle source en utilisant une classe DragObject ayant pour attributs le controle source et la valeur.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
     
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
     
    namespace WindowsFormsApplication2
    {
     
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
     
            private void Form1_Load(object sender, EventArgs e)
            {
                for (int i = 0; i < 26; i++)
                    listBox1.Items.Add((char)(64 + i));
            }
     
            private void listBox1_SelectedValueChanged(object sender, EventArgs e)
            {
                DragObject vDragObject = new DragObject();
                vDragObject.Source = listBox1;
                vDragObject.Value = listBox1.SelectedItem;
     
                listBox1.DoDragDrop(vDragObject, DragDropEffects.Move);
            }
     
            private void listBox2_DragEnter(object sender, DragEventArgs e)
            {
                e.Effect = DragDropEffects.Move;
            }
     
            private void listBox2_DragDrop(object sender, DragEventArgs e)
            {
                DragObject vDragObject = (DragObject)e.Data.GetData(typeof(DragObject));
                listBox2.Items.Add(vDragObject.Value.ToString());
                ((ListBox)vDragObject.Source).Items.Remove(vDragObject.Value);
            }
        }
     
        public class DragObject
        {
            public Control Source { get; set; }
            public object Value { get; set; }
        }
    }
    Cela fonctionne parfaitement chez moi. Comme tu le liras dans le code, il y a 2 listbox (listbox1 et listbox2) qui sont abonnées aux évènements qui vont bien.

    Bon courage

  3. #3
    Expert confirmé

    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Septembre 2006
    Messages
    3 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Septembre 2006
    Messages : 3 580
    Points : 5 195
    Points
    5 195
    Par défaut
    euh, l'objet de départ peut etre averti. Il y a un evenement qui le fait
    (genre Give Feedback ou un truc du genre)

    donc, ce n'est pas celui qui receptionne qui doit dire à l'élément de départ de faire quelque chose, mais le mécanisme de Drag & Drop qui implémente déja la notification de fin de drop à l'émetteur.. pour peu que celui ci y soit abonner
    The Monz, Toulouse
    Expertise dans la logistique et le développement pour
    plateforme .Net (Windows, Windows CE, Android)

  4. #4
    Membre éprouvé
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2007
    Messages
    693
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juillet 2007
    Messages : 693
    Points : 1 187
    Points
    1 187
    Par défaut
    Je suis d'accord avec le précédent message, d'ailleurs MSDN donne un exemple ici.

    Voici un exemple qui fonctionne correctement chez moi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    using System;
    using System.Windows.Forms;
     
    namespace WindowsFormsApplication2
    {
     
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
     
            private void Form1_Load(object sender, EventArgs e)
            {
                for (int i = 0; i < 26; i++)
                    listBox1.Items.Add((char)(64 + i));
            }
     
            private void listBox1_SelectedValueChanged(object sender, EventArgs e)
            {
                if (listBox1.SelectedItem != null)
                    if (listBox2.DoDragDrop(listBox1.SelectedItem, DragDropEffects.Move) == DragDropEffects.Move)
                    {
                        listBox1.Items.Remove(listBox1.SelectedItem);
                    }
            }
     
            private void listBox2_DragEnter(object sender, DragEventArgs e)
            {
                e.Effect = DragDropEffects.Move;
            }
     
            private void listBox2_DragDrop(object sender, DragEventArgs e)
            {
                listBox2.Items.Add(e.Data.GetData(typeof(char)));
            }
        }
    }

  5. #5
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2003
    Messages
    194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2003
    Messages : 194
    Points : 118
    Points
    118
    Par défaut
    Alors ostenhard, je te dit SUPER MERCI BEAUCOUP !!!
    Car cela résous totalement mon problème !

    En fait j'avais pas pensé à faire ma suppression avant le déplacment mais après ce qui me demandait de connaitre le contrôle de départ. Et comme je le connais à l'instant du clic dans la 1ère ListBox il me suffisait de le faire à ce moment là.

    Voici le code complet de la classe pour ceux que cela intéresseraient :
    La classe s'appelle "ListBoxDAD" mais libre à vous de changer son nom...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
     
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    using System.Drawing;
    using System.Collections;
     
    namespace Votre_Namespace
    {
        class ListBoxDAD : ListBox
        {
            private int lastMouseUpItemIndex = -1;
            private bool isDropSource = false;
     
            public ListBoxDAD()
            {
                this.AllowDrop = true;  //Permet le drag & drop
                this.SelectionMode = SelectionMode.One; // une selection à la fois
     
                DragDrop += new System.Windows.Forms.DragEventHandler(OnDragDrop);
                DragEnter += new System.Windows.Forms.DragEventHandler(OnDragEnter);
                MouseDown += new System.Windows.Forms.MouseEventHandler(OnMouseDown);
                SelectedIndexChanged += new System.EventHandler(OnSelectedIndexChanged);
            }
     
            // Lors du clic d'un élément
            private void OnMouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
            {
                if (MouseButtons == MouseButtons.Left)// && SelectedIndex == lastMouseUpItemIndex)
                {
                    if (SelectedItem != null)
                    {
                        isDropSource = true;
                        if (DoDragDrop(SelectedItem, DragDropEffects.Move) == DragDropEffects.Move)
                        {
                            Items.Remove(SelectedItem);
                        }
                        isDropSource = false;
                        lastMouseUpItemIndex = this.SelectedIndex;
                    }
                }
            }
     
            // lors du déplacement de l'élément (icone à utiliser)
            private void OnDragEnter(object sender, System.Windows.Forms.DragEventArgs e)
            {
                if (e.Data.GetDataPresent(DataFormats.Text) && !isDropSource)
                    e.Effect = DragDropEffects.Move;
                else
                    e.Effect = DragDropEffects.None;
            }
     
            // lors du dépos de l'élément
            private void OnDragDrop(object sender, DragEventArgs e)
            {
                if (e.Effect == DragDropEffects.Move)
                {
                    Point point = this.PointToClient(new Point(e.X, e.Y));
                    int index = this.IndexFromPoint(point);
                    if (index > -1 && index < this.Items.Count)
                    {
                        Items.Insert(index, e.Data.GetData(DataFormats.Text));
                    }
                    else
                    {
                        Items.Add(e.Data.GetData(DataFormats.Text));
                    }
                }
            }
     
            private void OnSelectedIndexChanged(object sender, System.EventArgs e)
            {
                lastMouseUpItemIndex = this.SelectedIndex;
            }
        }
    }
    Si tout semble bien marcher c'est que vous avez oublié quelque chose !

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 09/12/2011, 18h27
  2. [JList] afficher un menu lors d'un drag and drop
    Par skyangel dans le forum Composants
    Réponses: 4
    Dernier message: 12/03/2008, 15h16
  3. Réponses: 13
    Dernier message: 20/03/2006, 14h31
  4. Réponses: 4
    Dernier message: 01/10/2005, 11h03

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