2009-01-30 3 views
12

J'ai un winform avec une listbox et une arborescence.C# Glisser-déposer de la liste à l'arborescence

Une fois que ma liste est remplie avec des éléments, je veux les faire glisser (multiples ou simples) de la liste et les déposer dans un nœud dans l'arborescence.

Si quelqu'un a un bon exemple en C# ce serait génial.

+1

Pouvez-vous éditer votre message et nous dire exactement quelle partie de ceci vous avez un problème? Les gens ici ont tendance à ne pas répondre bien aux questions de type "ples envoyer le codz" –

Répondre

23

Cela fait longtemps que je n'ai pas fait de Drag/Drop alors j'ai pensé que j'écrirais un échantillon rapide.

Fondamentalement, j'ai un formulaire, avec une zone de liste sur la gauche, et une arborescence sur la droite. Ensuite, j'ai mis un bouton sur le dessus. Lorsque le bouton est cliqué, il met simplement la date des dix prochains jours dans la zone de liste. Il remplit également TreeView avec 2 nœuds parents et deux nœuds enfants. Ensuite, il vous suffit de gérer tous les événements glisser/déposer suivants pour le faire fonctionner.

public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 
      this.treeView1.AllowDrop = true; 
      this.listBox1.AllowDrop = true; 
      this.listBox1.MouseDown += new MouseEventHandler(listBox1_MouseDown); 
      this.listBox1.DragOver += new DragEventHandler(listBox1_DragOver); 

      this.treeView1.DragEnter += new DragEventHandler(treeView1_DragEnter); 
      this.treeView1.DragDrop += new DragEventHandler(treeView1_DragDrop); 

     } 

     private void button1_Click(object sender, EventArgs e) 
     { 
      this.PopulateListBox(); 
      this.PopulateTreeView(); 
     } 

     private void PopulateListBox() 
     { 
      for (int i = 0; i <= 10; i++) 
      { 
       this.listBox1.Items.Add(DateTime.Now.AddDays(i)); 
      } 
     } 

     private void PopulateTreeView() 
     { 
      for (int i = 1; i <= 2; i++) 
      { 
       TreeNode node = new TreeNode("Node" + i); 
       for (int j = 1; j <= 2; j++) 
       { 
        node.Nodes.Add("SubNode" + j); 
       } 
       this.treeView1.Nodes.Add(node); 
      } 
     } 

     private void treeView1_DragDrop(object sender, DragEventArgs e) 
     { 

      TreeNode nodeToDropIn = this.treeView1.GetNodeAt(this.treeView1.PointToClient(new Point(e.X, e.Y))); 
      if (nodeToDropIn == null) { return; } 
      if(nodeToDropIn.Level > 0) 
      { 
       nodeToDropIn = nodeToDropIn.Parent; 
      } 

      object data = e.Data.GetData(typeof(DateTime)); 
      if (data == null) { return; } 
      nodeToDropIn.Nodes.Add(data.ToString()); 
      this.listBox1.Items.Remove(data); 
     } 

     private void listBox1_DragOver(object sender, DragEventArgs e) 
     { 
      e.Effect = DragDropEffects.Move; 
     } 

     private void treeView1_DragEnter(object sender, DragEventArgs e) 
     { 
      e.Effect = DragDropEffects.Move; 
     } 

     private void listBox1_MouseDown(object sender, MouseEventArgs e) 
     { 
      this.listBox1.DoDragDrop(this.listBox1.SelectedItem, DragDropEffects.Move); 
     } 


    } 
+0

Merci beaucoup pour cela. J'ai juste besoin d'un exemple de code pour confirmer que je ne vais pas faire glisser et déposer des "effets" en mono (au moins sur OSX). Votre exemple génial et COMPLET m'a économisé une tonne de travail. –

3

Vous souhaitez utiliser la fonction GetItemAt (Pointage) pour traduire l'emplacement X, Y en élément ListView.

Voici un très bon article à ce sujet: Drag and Drop Using C#.

Pour que l'élément soit déplacé lors du glissement, vous devez utiliser COM ImageList, qui est bien décrit dans l'article suivant: Custom Drag-Drop Images Using ImageLists.

Questions connexes