2009-01-30 55 views
12

Tengo un winform con un listbox y una vista de árbol.C# Arrastrar y soltar desde listbox a treeview

Una vez que mi listbox está lleno de elementos, quiero arrastrarlos (múltiples o únicos) desde el cuadro de lista y soltarlos en un nodo en la vista de árbol.

Si alguien tiene un buen ejemplo en C#, sería genial.

+1

¿Puedes editar tu publicación y decirnos exactamente con qué parte de esto estás teniendo un problema? La gente de aquí tiende a no responder bien a las preguntas del tipo "ples send the codz" –

Respuesta

23

Ha pasado un tiempo desde que me he metido con Drag/Drop así que pensé que iba a escribir una muestra rápida.

Básicamente, tengo un formulario, con un cuadro de lista a la izquierda, y una vista de árbol a la derecha. Luego puse un botón en la parte superior. Cuando se hace clic en el botón, simplemente pone la fecha de los próximos diez días en el cuadro de lista. También rellena el TreeView con 2 nodos principales y dos secundarios. Luego, solo tiene que manejar todos los sucesivos eventos de arrastrar/soltar para que funcione.

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

Muchas gracias por esto. Solo necesitaba un ejemplo de código para confirmar que no estoy obteniendo arrastrar y soltar "efectos" en Mono (al menos en OSX). Tu excelente y COMPLETO ejemplo me ahorró mucho trabajo. –

3

Desea utilizar la función GetItemAt (Punto de punto) para traducir la ubicación X, Y al elemento listview.

Aquí hay bastante buen artículo al respecto: Drag and Drop Using C#.

Para hacer que el elemento que se arrastra sea visible mientras se arrastra, debe usar COM ImageList, que está bien descrito en el siguiente artículo Custom Drag-Drop Images Using ImageLists.