最近一个项目要用到从listview向treeview拖动item,达到从外部拖动图标成为树形结构的一部分,通过查阅资料总结了一些实现方式,分享给大家。这是winform中的例子。
在进行拖放操作之前,必须要对进行拖放操作的组件的"AllowDrop"属性值设定为"True",因为此属性是确定组件是否可以进行拖放操作的。
我们会用到三种事件:"ItemDrag"、"DragEnter"、"DragDrop"。其中只有第一种事件是在源组件中触发的,另外二种事件是在目标组件中触发的。其中当用户拖动组件触发"ItemDrag"事件;当拖动数据进入目标组件区域触发"DragEnter"事件;当用户在目标组件区域放置拖动的数据触发"DragDrop"事件。
实现代码如下:
1
private
void
listView1_ItemDrag(
object
sender, System.Windows.Forms.ItemDragEventArgs e)
2 {
3 this .DoDragDrop(e.Item,DragDropEffects.Move);
4 }
5
6 private void listView1_DragEnter( object sender, System.Windows.Forms.DragEventArgs e)
7 {
8 e.Effect = DragDropEffects.Move;
9 }
10
11 private void treeView1_DragEnter( object sender, System.Windows.Forms.DragEventArgs e)
12 {
13 // 判定是否现在拖动的数据是LISTVIEW项
14 ListViewItem lvi = (ListViewItem)e.Data.GetData( typeof (ListViewItem));
15 if (lvi != null )
16 {
17 e.Effect = DragDropEffects.Move;
18 }
19 else
20 Cursor = Cursors.No;
21
22 }
23 private void treeView1_DragDrop( object sender, System.Windows.Forms.DragEventArgs e)
24 {
25 // 获得拖放中的项
26 ListViewItem lvi = (ListViewItem)e.Data.GetData( typeof (ListViewItem));
27
28 // 根据鼠标坐标确定要移动到的目标节点
29 Point pt;
30 TreeNode targeNode;
31 pt = ((TreeView)(sender)).PointToClient( new Point(e.X, e.Y));
32 targeNode = this .treeView1.GetNodeAt(pt);
33 TreeNode NewMoveNode = new TreeNode(lvi.Text);
34 if (targeNode != null ) // 如果目标节点未选中,则添加到一级节点
35 {
36 targeNode.Nodes.Add(NewMoveNode);
37 // 更新当前拖动的节点选择
38 treeView1.SelectedNode = NewMoveNode;
39 // 展开目标节点,便于显示拖放效果
40 targeNode.Expand();
41 treeView1.Refresh();
42 }
43 else
44 {
45 this .treeView1.Nodes.Add(NewMoveNode);
46 // 更新当前拖动的节点选择
47 treeView1.SelectedNode = NewMoveNode;
48 // 展开目标节点,便于显示拖放效果
49 treeView1.ExpandAll();
50 treeView1.Refresh();
51 }
52
53
54 }
2 {
3 this .DoDragDrop(e.Item,DragDropEffects.Move);
4 }
5
6 private void listView1_DragEnter( object sender, System.Windows.Forms.DragEventArgs e)
7 {
8 e.Effect = DragDropEffects.Move;
9 }
10
11 private void treeView1_DragEnter( object sender, System.Windows.Forms.DragEventArgs e)
12 {
13 // 判定是否现在拖动的数据是LISTVIEW项
14 ListViewItem lvi = (ListViewItem)e.Data.GetData( typeof (ListViewItem));
15 if (lvi != null )
16 {
17 e.Effect = DragDropEffects.Move;
18 }
19 else
20 Cursor = Cursors.No;
21
22 }
23 private void treeView1_DragDrop( object sender, System.Windows.Forms.DragEventArgs e)
24 {
25 // 获得拖放中的项
26 ListViewItem lvi = (ListViewItem)e.Data.GetData( typeof (ListViewItem));
27
28 // 根据鼠标坐标确定要移动到的目标节点
29 Point pt;
30 TreeNode targeNode;
31 pt = ((TreeView)(sender)).PointToClient( new Point(e.X, e.Y));
32 targeNode = this .treeView1.GetNodeAt(pt);
33 TreeNode NewMoveNode = new TreeNode(lvi.Text);
34 if (targeNode != null ) // 如果目标节点未选中,则添加到一级节点
35 {
36 targeNode.Nodes.Add(NewMoveNode);
37 // 更新当前拖动的节点选择
38 treeView1.SelectedNode = NewMoveNode;
39 // 展开目标节点,便于显示拖放效果
40 targeNode.Expand();
41 treeView1.Refresh();
42 }
43 else
44 {
45 this .treeView1.Nodes.Add(NewMoveNode);
46 // 更新当前拖动的节点选择
47 treeView1.SelectedNode = NewMoveNode;
48 // 展开目标节点,便于显示拖放效果
49 treeView1.ExpandAll();
50 treeView1.Refresh();
51 }
52
53
54 }
最后不要忘记添加相应的事件!
这样就可以实现简单的从外部拖动节点到树形结构中了。关于插入图片在下一篇文章中介绍。