c# winform TreeView与ListView的项互相拖动的应用

本文展示了如何在C# WinForm应用中实现在TreeView和ListView之间进行项的拖放操作。通过ItemDrag和DragDrop事件处理,实现了从ListView拖放到TreeView,以及从TreeView拖放到ListView的功能,允许用户自由调整元素布局。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#region 将LISTVIEW项拖动TREEVIEW中

        
/// <summary>
        
/// 对选中项指定Move的“开始拖动操作”
        
/// </summary>
        
/// <param name="sender"></param>
        
/// <param name="e"></param>
        private void listView1_ItemDrag(object sender, System.Windows.Forms.ItemDragEventArgs e)
        {
            
this.DoDragDrop(e.Item,DragDropEffects.Move);
        }

        
private void listView1_DragEnter(object sender, System.Windows.Forms.DragEventArgs e)
        {
            e.Effect
=DragDropEffects.Move;
        }

        
private void treeView1_DragEnter(object sender, System.Windows.Forms.DragEventArgs e)
        {
            
//判定是否现在拖动的数据是LISTVIEW项
            ListViewItem lvi = (ListViewItem)e.Data.GetData(typeof(ListViewItem)); 
            
if (lvi != null
            { 
                e.Effect 
= DragDropEffects.Move; 
            } 
            
else 
                Cursor 
= Cursors.No; 

        }
        
private void treeView1_DragDrop(object sender, System.Windows.Forms.DragEventArgs e)
        {
            
//获得拖放中的项
            ListViewItem lvi = (ListViewItem)e.Data.GetData(typeof(ListViewItem)); 

            
//根据鼠标坐标确定要移动到的目标节点
            Point pt;
            TreeNode targeNode;
            pt 
= ((TreeView)(sender)).PointToClient(new Point(e.X, e.Y));
            targeNode 
= this.treeView1.GetNodeAt(pt);
            TreeNode NewMoveNode  
=new TreeNode(lvi.Text);
            
if(targeNode!=null)//如果目标节点未选中,则添加到一级节点
            {
                targeNode.Nodes.Add(NewMoveNode);
                
//更新当前拖动的节点选择
                treeView1.SelectedNode = NewMoveNode;
                
//展开目标节点,便于显示拖放效果
                targeNode.Expand();
                treeView1.Refresh();
            }
            
else
            {
                
this.treeView1.Nodes.Add(NewMoveNode);
                
//更新当前拖动的节点选择
                treeView1.SelectedNode = NewMoveNode;
                
//展开目标节点,便于显示拖放效果
                treeView1.ExpandAll();
                treeView1.Refresh();
            }
            
        }
        
#endregion

 

#region 将treeView的项拖动到ListView

        
//定义被选择的项
        private TreeNode _selectednode;

        
/// <summary>
        
/// 选择treeView的项
        
/// </summary>
        
/// <param name="sender"></param>
        
/// <param name="e"></param>
        private void treeView2_AfterSelect(object sender, System.Windows.Forms.TreeViewEventArgs e)
        {
            
try 
            {
                _selectednode 
= e.Node; 
            }
            
catch { }
        }
        
/// <summary>
        
/// 对选中项指定Move的“开始拖动操作”
        
/// </summary>
        
/// <param name="sender"></param>
        
/// <param name="e"></param>
        private void treeView2_ItemDrag(object sender, System.Windows.Forms.ItemDragEventArgs e)
        {
            
this.DoDragDrop(_selectednode,DragDropEffects.Move);
        }

        
private void treeView2_DragEnter(object sender, System.Windows.Forms.DragEventArgs e)
        {
            e.Effect
=DragDropEffects.Move;
        }

        
/// <summary>
        
/// 添加MouseDown是因为,MouseDown先执行AfterSelect,所以在没有AfterSelect时,MouseDown要先选中被选取项
        
/// </summary>
        
/// <param name="sender"></param>
        
/// <param name="e"></param>
        private void treeView2_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
        {
            
try 
            { 
                
if ((e.Button & MouseButtons.Left) == MouseButtons.Left) 
                { 
                    _selectednode 
= treeView2.GetNodeAt(e.X,e.Y); 
                    treeView2.SelectedNode 
= _selectednode;
                } 
            } 
            
catch { } 

        }

        
private void FillListView(TreeNodeCollection nodes) 
        { 
            
for (int i = 0; i < nodes.Count; i++
            { 
                ListViewItem lvwItem 
= new ListViewItem(nodes[i].Text, nodes[i].ImageIndex); 
                lvwItem.Tag 
= nodes[i].Tag; 
                listView2.Items.Add(lvwItem); 
            } 
        }

        
//当选中项移到listView的工作区时,指定被拖动的目标的移动方式
        private void listView2_DragEnter(object sender, System.Windows.Forms.DragEventArgs e)
        {
            
try 
            { 
                TreeNode node 
= (TreeNode)e.Data.GetData(typeof(TreeNode)); 
                
if (node != null
                { 
                    e.Effect 
= DragDropEffects.Move; 
                } 
                
else 
                    Cursor 
= Cursors.No; 
            } 
            
catch { } 
            
finally { Cursor = Cursors.Default; } 

        }

        
//当选中项在listView在随SHU标移动时,指定被拖动的目标的移动方式
        private void listView2_MouseMove(object sender, System.Windows.Forms.MouseEventArgs e)
        {
            
try 
            { 
                
if (_selectednode != null & (e.Button & MouseButtons.Left) == MouseButtons.Left) 
                { 
                    DragDropEffects dropEffect 
= listView2.DoDragDrop(_selectednode, DragDropEffects.Move); 
                } 
            } 
            
catch { } 

        }

        
//当被放入控件时
        private void listView2_DragDrop(object sender, System.Windows.Forms.DragEventArgs e)
        {
            
try 
            { 
                TreeNode node 
= (TreeNode)e.Data.GetData(typeof(TreeNode)); 
                
if (node != null
                    listView2.Items.Add(node.Text, node.ImageIndex); 
            } 
            
catch { } 
            
finally { Cursor = Cursors.Default; } 
        }

        
#endregion

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值