功能实现:
1.从工具窗体往任务窗体拖拽;
2.在任务窗体中改变节点的顺序;
3.右键复制节点,删除节点
工具窗体treeview1,:
涉及使用的事件:DragEnter, DragOver ,ItemDrag, NodeMouseDoubleClick,
任务窗口treeview2:
使用的事件:DragEnter,DragOver,ItemDrag,DragDrop
DragEnter与treeview1一样;
DragOver与treeview2一样;
ItemDrag 与treeview1一样,tree_ItemDrag(treeview2, e, 120, -30);然后刷新树形控件,进行Refresh()
最关键的是任务窗口(目标窗体)的DragDrop
private void treeView2_DragDrop(object sender, DragEventArgs e) { //ClsMain.tree_DragDrop(sender, e); //获得拖放中的节点 TreeNode moveNode = (TreeNode)(e.Data.GetData(typeof(TreeNode)));// // e.Data.GetData("System.Windows.Forms.TreeNode"); //根据鼠标坐标确定要移动到的目标节点 Point pt; TreeNode targeNode; pt = ((TreeView)(sender)).PointToClient(new Point(e.X, e.Y)); targeNode = this.treeView2.GetNodeAt(pt); TreeNode NewMoveNode = new TreeNode(moveNode.Text); if (targeNode != null)//如果目标节点未选中,则添加到一级节点 { targeNode.Nodes.Add(NewMoveNode); //更新当前拖动的节点选择 treeView2.SelectedNode = NewMoveNode; //展开目标节点,便于显示拖放效果 targeNode.Expand(); treeView2.Refresh(); } else { this.treeView2.Nodes.Add(NewMoveNode); //更新当前拖动的节点选择 treeView2.SelectedNode = NewMoveNode; //展开目标节点,便于显示拖放效果 treeView2.ExpandAll(); treeView2.Refresh(); } }
1.comctl32.dll文件存储在电脑中“C:/Windows/System32”文件夹下
2.DllImport的基本使用
DllImport是System.Runtime.InteropServices命名空间下的一个属性类,其功能是提供从非托管DLL导出函数的必要调用信息。
其中,引入到C#中的只能是非托管dll中的方法(或者说函数),而不能是数据(或者说变量)
(1)引入命名空间
using System.Runtime.InteropServices;
(2)创建函数名称
[DllImport("demo.dll")]
public static extern bool OpenDemo();
其中:
修饰符static和extern是必不可少的(extern外部修饰符,常与DllImport属性一起使用,用于支持在外部实现方法)
最少要提供包含入口点的dll的名称
非常重要的外部参考:在Winform中从外部拖动节点到树形结构https://www.cnblogs.com/mjsn/p/6150909.html
在进行拖放操作之前,必须要对进行拖放操作的组件的"AllowDrop"属性值设定为"True",因为此属性是确定组件是否可以进行拖放操作的。 我们会用到三种事件:"ItemDrag"、"DragEnter"、"DragDrop"。其中只有第一种事件是在源组件中触发的,另外二种事件是在目标组件中触发的。其中当用户拖动组件触发"ItemDrag"事件;当拖动数据进入目标组件区域触发"DragEnter"事件;当用户在目标组件区域放置拖动的数据触发"DragDrop"事件。 实现代码如下: 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 }
以上第一部分功能:窗体间treeview节点功能拖拽实现