ListView 和TreeView控件相互拖拽

因项目需要,需要做一个类似的功能,参考了网上的一篇资料,并根据自己的理解进行了一些功能的修改,主要实现了 两个控件间的相互拖拽、TreeView自身的拖拽(拖拽只在一级节点上,没有涉及到子节点或多级子节点,有兴趣的朋友可以在此基础上进行修改即可),原资料链接(http://blog.csdn.net/qingchouchen/article/details/3547216

以下是实现代码:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace lvtv拖拽
{
    public partial class Form1 : Form
    {
        Point position = new Point();
        bool isSourceLView = false;
        bool isSourceTView = false;
        public Form1()
        {
            InitializeComponent();
        }

        private void treeView1_ItemDrag(object sender, ItemDragEventArgs e)
        {
            string strItem = e.Item.ToString();
            DoDragDrop(strItem, DragDropEffects.Move|DragDropEffects.Copy);
            isSourceTView = true;
            isSourceLView = false;
        }

        private void treeView1_DragEnter(object sender, DragEventArgs e)
        {
            //判断是否目前拖动的数据是字符串,如果是,则拖动符串对目的组件进行拷贝
            if (e.Data.GetDataPresent(DataFormats.Text))
            {
                e.Effect = DragDropEffects.Move;
            }
            else
                e.Effect = DragDropEffects.None;
        }

        private void listView1_DragEnter(object sender, DragEventArgs e)
        {
            //判断是否目前拖动的数据是字符串,如果是,则拖动符串对目的组件进行拷贝
            if (e.Data.GetDataPresent(DataFormats.Text))
            {
                e.Effect = DragDropEffects.Move;
            }
            else
                e.Effect = DragDropEffects.None;
        }

        private void listView1_DragDrop(object sender, DragEventArgs e)
        {
            if (isSourceTView)
            {
                string dummy = "temp";
                //获得进行"Drag"操作中拖动的字符串
                string s = (string)e.Data.GetData(dummy.GetType());
                s = s.Substring(s.IndexOf(":") + 1).Trim();
                //判断是否已经存在此节点
                bool isExited=false;
                for (int i = 0; i < listView1.Items.Count; i++)
                {
                    if (s == listView1.Items[i].Text)
                    {
                        isExited = true;
                        break;
                    }
                }
                if (isExited)
                    return;
                position.X = e.X;
                position.Y = e.Y;
                position = listView1.PointToClient(position);
                //在目标组建中加入以此字符串为标题的项目
                listView1.Items.Add(new ListViewItem(s, 0));
                //删除移动的节点
                //treeView1.Nodes.RemoveByKey(s);
                for (int i = 0; i < treeView1.Nodes.Count; i++)
                {
                    if (s == treeView1.Nodes[i].Text)
                    {
                        treeView1.Nodes.Remove(treeView1.Nodes[i]);
                        break;
                    }
                }
            }
            
            
        }

        private void listView1_ItemDrag(object sender, ItemDragEventArgs e)
        {
            //此处用鼠标左键移动
            if (e.Button != MouseButtons.Left)
                return;
            int nTotalSelected = listView1.SelectedIndices.Count;
            if (nTotalSelected <= 0)
                return;
            System.Collections.IEnumerator selCol = listView1.SelectedItems.GetEnumerator();
            selCol.MoveNext();

            ListViewItem lvItem = (ListViewItem)selCol.Current;
            string mDir = "";
            string tempS = "";
            for (int i = 0; i < lvItem.SubItems.Count; i++)
            {
                mDir += lvItem.SubItems[i].Text + ",";
              
            }
            tempS = mDir.Substring(0, mDir.Length - 1);
            if (tempS == "")
                return;
            isSourceLView = true;
            isSourceTView = false;
            //开始对字符串进行拖拽
            listView1.DoDragDrop(tempS, DragDropEffects.Move);
           
        }

        private void treeView1_DragDrop(object sender, DragEventArgs e)
        {
           
            //获得进行"Drag"操作中拖动的字符串
            string dummy = "temp";
            string s = (string)e.Data.GetData(dummy.GetType());
            s = s.Substring(s.IndexOf(":") + 1).Trim();
            
            position.X = e.X;
            position.Y = e.Y;
            position = treeView1.PointToClient(position);

            TreeNode DropNode = this.treeView1.GetNodeAt(position);
            if (isSourceLView == true)
            {
                //判断 treeview中是否存在此名称的节点
                bool isExist = false;
                for (int i = 0; i < treeView1.Nodes.Count; i++)
                {
                    if (s == treeView1.Nodes[i].Text)
                    {
                        isExist = true;
                        break;
                    }
                }
                if (isExist)
                    return;
                if (DropNode != null)
                {
                    TreeNode DragNode = new TreeNode(s);
                    DragNode.ImageIndex = 0;
                    treeView1.Nodes.Insert(DropNode.Index + 1, DragNode);
                    //移除treeview中的节点
                    for (int i = 0; i < listView1.Items.Count; i++)
                    {
                        if (s == listView1.Items[i].Text)
                        {
                            listView1.Items.Remove(listView1.Items[i]);
                        }
                    }
                }
            }
            else 
            {
                TreeNode myNode = null;
                for (int i = 0; i < treeView1.Nodes.Count; i++)
                {
                    if (treeView1.Nodes[i].Text == s)
                    {
                        myNode = treeView1.Nodes[i];
                        break;
                    }
                }
                if (DropNode != null && DropNode != myNode)
                {
                    TreeNode dragNode = myNode;
                    myNode.Remove();
                    treeView1.Nodes.Insert(DropNode.Index + 1, dragNode);
                  
                }
            }

        }

    }
}
运行结构就不贴了……

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值