Aller au contenu

(Hors Sujet) : Drag and Drop


PhilOctet

Messages recommandés

Bonjour,

 

je sais que ce n'est pas le lieu pour débattre de ce genre de problème mais j'ai fouillé un peu partout et je n'ai pas trouvé d'aide. Et comme j'en ai besoin, je me permet cette largesse.

 

J'ai un treeview de type :

- animaux

- - chien

- - chat

- - souris

- VIP

- - Astérix

- - Obélix

- - Falbala

 

Puis une listview de plusieurs colonnes en partie renseignée.

VIP | compagnon

Astérix.| Obélix

Falbala.| ...

Obélix..| ...

......... | souris

 

Depuis le treeview, j'aimerai faire glisser la copie d'un item choisi vers l'un des champs de la listview.

Par exemple, si je veux compléter la champs "compagnon" de la ligne "Obélix", je vais récupérer "chien" du treeview et le faire glisser vers la ligne "Obélix" de la listview.

 

Est-ce l'un d'entre vous pourrait me transmettre un bout de code qui me bloquerait ?

 

merci.

Lien vers le commentaire
Partager sur d’autres sites

Un petit exemple avec un contrôle TreeView nommé treeView et contrôle ListView nommé listView.

 

Pour faire un glisser déposer entre deux contrôles, il faut :

- que le contrôle cible ait la propriété AllowDrop = true ;

- utiliser la méthode DoDragDrop ;

- gérer les évènements DragEnter et DragDrop du contrôle cible.

 

On peut utiliser l'évènement MouseMove du contrôle source (le TreeView) pour lancer la méthode DoDragDrop si le bouton gauche est maintenu enfoncé.

L'évènement DragEnter du contrôle cible (ListView) se déclenche quand le curseur entre dans le contrôle on vérifie à ce moment que la donnée à glisser/déposer est bien du type requis (ici String) ce qui a pour effet de modifier (ou non) le curseur.

Pour l'évènement DragDrop (quand le bouton gauche de la souris est relâché) il va être nécessaire de déterminer sa position dans le contrôle pour copier la donnée dans le bon élément (ou sous élément) de la liste ou de l'ajouter en fin de liste si le curseur est placé au delà du dernier élément.

Contrairement aux contrôles ListBox, les controles ListView n'ont pas de méthode IndexFromPoint qui retourne l'indice de l'élément dans la liste en fonction d'un point exprimé dans le système de coordonnées du contrôle, il faut donc en définir une.

Il faut aussi, toujours en fonction de la position du curseur au moment du largage, déterminer dans quelle colonne copier le texte.

 

using System.Drawing;
using System.Windows.Forms;

namespace DragAndDropSample
{
   public partial class DragAndDrop : Form
   {
       public DragAndDrop()
       {
           InitializeComponent();
           listView.AllowDrop = true;
       }

       // lance DoDragDrop si la souris bouge avec le bouton gauche enfoncé dans le contrôle treeView
       private void treeView_MouseMove(object sender, MouseEventArgs e)
       {
           if (e.Button == MouseButtons.Left)
           {
               DoDragDrop(treeView.SelectedNode.Text, DragDropEffects.Copy);
           }
       }

       // quand la souris entre dans le ListView, si la donnée est de type String, 
       // l'effet sera : Copier, sinon aucun effet
       private void listView_DragEnter(object sender, DragEventArgs e)
       {
           if (e.Data.GetDataPresent(DataFormats.Text))
           {
               e.Effect = DragDropEffects.Copy;
           }
           else
           {
               e.Effect = DragDropEffects.None;
           }
       }

       // la donnée est copiée en fonction de la position du curseur dans le contrôle ListView
       private void listView_DragDrop(object sender, DragEventArgs e)
       {
           // conversion de la donnée en String
           string str = (string)e.Data.GetData(typeof(System.String));
           // conversion de la position du curseur (coordonnées écran) en coordonnées contrôle
           Point clientPoint = listView.PointToClient(new Point(e.X, e.Y));
           // calcul de l'indice de l'élement sous le curseur
           int index = IndexFromPoint(clientPoint);

           // le curseur est au delà de la liste
           if (index == -1)
           {
               ListViewItem newItem;
               // première colonne
               if (clientPoint.X < listView.Columns[0].Width)
               {
                   newItem = new ListViewItem(new string[] { str, "" });
               }
               // deuxième colonne
               else
               {
                   newItem = new ListViewItem(new string[] { "", str });
               }
               // ajout du nouvel élément
               listView.Items.Add(newItem);
           }

           // il y a un élément à l'indice trouvé
           else
           {
               // élément à l'indice trouvé
               ListViewItem lvi = listView.Items[index];
               // première colonne
               if (clientPoint.X < listView.Columns[0].Width)
               {
                   lvi.Text = str;
               }
               // deuxième colonne
               else
               {
                   listView.Items[index] = new ListViewItem(new string[] { lvi.Text, str });
               }
           }
       }

       // retourne l'indice de l'élément sous le curseur ou -1 si le curseur est au delà de la liste existante.
       private int IndexFromPoint(Point pt)
       {
           int index = pt.Y / listView.Items[0].Bounds.Height - 1;
           if (index < listView.Items.Count)
           {
               return index;
           }
           else
           {
               return -1;
           }
       }
   }
}

B&B.gif

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Lien vers le commentaire
Partager sur d’autres sites

Créer un compte ou se connecter pour commenter

Vous devez être membre afin de pouvoir déposer un commentaire

Créer un compte

Créez un compte sur notre communauté. C’est facile !

Créer un nouveau compte

Se connecter

Vous avez déjà un compte ? Connectez-vous ici.

Connectez-vous maintenant
×
×
  • Créer...

Information importante

Nous avons placé des cookies sur votre appareil pour aider à améliorer ce site. Vous pouvez choisir d’ajuster vos paramètres de cookie, sinon nous supposerons que vous êtes d’accord pour continuer. Politique de confidentialité