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