ListView 和TreeView控件相互拖拽

来源:互联网 发布:2017高仿耐克淘宝店 编辑:程序博客网 时间:2024/04/30 20:49

因项目需要,需要做一个类似的功能,参考了网上的一篇资料,并根据自己的理解进行了一些功能的修改,主要实现了 两个控件间的相互拖拽、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);                                  }            }        }    }}
运行结构就不贴了……