C# Drag & drop from listbox to treeview

前端 未结 2 1171
梦毁少年i
梦毁少年i 2020-12-09 11:50

I have a winform with a listbox and a treeview.

Once my listbox is filled with items, I want to drag them (multiple or single) from the listbox and drop them in a n

相关标签:
2条回答
  • 2020-12-09 12:42

    It's been a while since I've messed with Drag/Drop so I figured I'll write a quick sample.

    Basically, I have a form, with a listbox on the left, and a treeview on the right. Then I put a button on top. When the button is clicked, it just puts the date of the next ten days into the list box. It also populates the TreeView with 2 parents nodes and two child nodes. Then, you just have to handle all the subsequent drag/drop events to make it work.

     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 讨论(0)
  • 2020-12-09 12:44

    You want to use the GetItemAt(Point point) function to translate X,Y location to the listview item.

    Here's quite good article about it: Drag and Drop Using C#.

    To make the item being dragged visible while dragging, you need to use COM ImageList, which is well described in the following article Custom Drag-Drop Images Using ImageLists.

    0 讨论(0)
提交回复
热议问题