C# 从列表框拖放到树视图

Posted

技术标签:

【中文标题】C# 从列表框拖放到树视图【英文标题】:C# Drag & drop from listbox to treeview 【发布时间】:2010-10-04 11:38:24 【问题描述】:

我有一个带有列表框和树视图的 winform。

一旦我的列表框充满了项目,我想将它们(多个或单个)从列表框中拖放到树视图中的一个节点中。

如果有人在 C# 中有一个很好的例子,那就太好了。

【问题讨论】:

您能否编辑您的帖子并准确告诉我们您遇到问题的哪一部分?这里的人往往不会很好地回答“请发送 codz”类型的问题 【参考方案1】:

我已经有一段时间没有搞乱拖放了,所以我想我会写一个快速的示例。

基本上,我有一个表单,左侧有一个列表框,右侧有一个树形视图。然后我在上面放了一个按钮。单击该按钮时,它只是将接下来十天的日期放入列表框中。它还使用 2 个父节点和两个子节点填充 TreeView。然后,您只需处理所有后续的拖放事件即可使其正常工作。

 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);
        


    

【讨论】:

非常感谢您。我只需要一个代码示例来确认我没有在 Mono 中获得拖放“效果”(至少在 OSX 上)。你伟大而完整的例子为我节省了大量的工作。 您好,我尝试了您的代码,但由于某种原因,被拖动的项目总是被添加到树的根(第一个)节点。 nodeToDropIn.Text 返回正确的节点名称,但项目被添加到父节点。可能是什么问题?【参考方案2】:

您想使用 GetItemAt(Point point) 函数将 X、Y 位置转换为列表视图项。

这里有一篇很好的文章:Drag and Drop Using C#。

要让被拖拽的item在拖拽的时候可见,需要使用COM ImageList,在下面的文章Custom Drag-Drop Images Using ImageLists中有很好的描述。

【讨论】:

以上是关于C# 从列表框拖放到树视图的主要内容,如果未能解决你的问题,请参考以下文章

WPF MVVM C#​​:列表框拖放,无需代码

WPF MVVM C#:列表框拖放而没有代码

WPF 从列表框中拖动项目并放入文本框中

如何从列表视图中获取数据作为字符串 C# asp.net

0188 案例:模态框拖拽

C# 使用单个按钮运行 3 个 MYSQL 插入查询 - 来自文本框和列表视图的数据