上篇我以MSDN上的两个ListBox间的拖动讲解了两个控件之间拖动的过程。见我的文章WinForm之控件拖动总结(原理篇),该篇将讲解WinForm中经常用到的TreeView和ListView之间的拖动。
(一)将ListView(源控件)中的项拖动到TreeView(目标控件)
原理请参见我的上一篇文章,这里直接贴代码。
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace ListViewDragToTreeView { public partial class Form1 : Form { public Form1() { InitializeComponent(); this.Load+=new EventHandler(Form1_Load); } private void Form1_Load(object sender, EventArgs e) { listView1.ItemDrag += new ItemDragEventHandler(listView1_ItemDrag); treeView1.DragEnter += new DragEventHandler(treeView1_DragEnter); treeView1.DragDrop += new DragEventHandler(treeView1_DragDrop); listView1.GiveFeedback+=new GiveFeedbackEventHandler(listView1_GiveFeedback); PopulateListViewTreeView(); } //初始化ListView和TreeView private void PopulateListViewTreeView() { List<string> lst = new List<string>(); lst.Add("Item1"); lst.Add("Item2"); lst.Add("Item3"); lst.Add("Item4"); lst.Add("Item5"); lst.Add("Item6"); // Populate ListView for (int i = 0; i < lst.Count; i++) { ListViewItem lvItem = new ListViewItem(lst[i].ToString()); listView1.Items.Add(lvItem); lvItem.EnsureVisible(); } // Populate TreeView for (int i = 0; i < lst.Count; i++) { TreeNode node = new TreeNode(lst[i].ToString()); if (i % 2 == 0) treeView1.Nodes.Add(node); else treeView1.Nodes[0].Nodes.Add(node); node.EnsureVisible(); } treeView1.ExpandAll(); treeView1.AllowDrop = true; } //当用户拖动ListView的Item的时候触发 private void listView1_ItemDrag(object sender, ItemDragEventArgs e) { //DoDragDrop开始拖放操作(触发treeView1_DragDrop事假) listView1.DoDragDrop(listView1.SelectedItems, DragDropEffects.Move); } //当项被拖动到TreeView控件的区域中时触发(如果鼠标进入另一个控件,则引发该控件的 DragEnter。) private void treeView1_DragEnter(object sender, DragEventArgs e) { if (e.Data.GetDataPresent(typeof(ListView.SelectedListViewItemCollection))) e.Effect = DragDropEffects.Move; } //当拖放操作完成的时候触发 private void treeView1_DragDrop(object sender, DragEventArgs e) { if (e.Data.GetDataPresent(typeof(ListView.SelectedListViewItemCollection).ToString(), false)) { Point loc = ((TreeView)sender).PointToClient(new Point(e.X, e.Y)); TreeNode destNode = ((TreeView)sender).GetNodeAt(loc); if (destNode == null) return; TreeNode tnNew; ListView.SelectedListViewItemCollection lstViewColl = (ListView.SelectedListViewItemCollection)e.Data.GetData(typeof(ListView.SelectedListViewItemCollection)); foreach (ListViewItem lvItem in lstViewColl) { tnNew = new TreeNode(lvItem.Text); tnNew.Tag = lvItem; destNode.Nodes.Insert(destNode.Index + 1, tnNew); destNode.Expand(); // Remove this line if you want to only copy items // from ListView and not move them lvItem.Remove(); } } } //在执行拖动操作期间发生 //通过 GiveFeedback 事件,拖动事件源能够修改鼠标指针的外观,以便在拖放操作过程中为用户提供视觉反馈。 private void listView1_GiveFeedback(object sender, GiveFeedbackEventArgs e) { e.UseDefaultCursors = false; if ((e.Effect & DragDropEffects.Move) == DragDropEffects.Move) Cursor.Current = Cursors.Cross; else Cursor.Current = Cursors.Default; } } }
(一)将LTreeView(源控件)中的项拖动到ListView(目标控件)
原理请参见我的上一篇文章,这里直接贴代码。
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace ListViewDragToTreeView { public partial class Form2 : Form { public Form2() { InitializeComponent(); treeView1.ItemDrag += new ItemDragEventHandler(treeView1_ItemDrag); listView1.DragEnter += new DragEventHandler(listView1_DragEnter); listView1.DragDrop += new DragEventHandler(listView1_DragDrop); PopulateListViewTreeView(); } void listView1_DragDrop(object sender, DragEventArgs e) { try { TreeNode node = (TreeNode)e.Data.GetData(typeof(TreeNode)); if (node != null) { ListViewItem item = new ListViewItem(node.Text, node.ImageIndex); listView1.Items.Add(item); } } catch { } finally { Cursor = Cursors.Default; } } void listView1_DragEnter(object sender, DragEventArgs e) { e.Effect = DragDropEffects.Move; } void treeView1_ItemDrag(object sender, ItemDragEventArgs e) { treeView1.DoDragDrop(this.treeView1.SelectedNode, DragDropEffects.Move); } //初始化ListView和TreeView private void PopulateListViewTreeView() { List<string> lst = new List<string>(); lst.Add("Item1"); lst.Add("Item2"); lst.Add("Item3"); lst.Add("Item4"); lst.Add("Item5"); lst.Add("Item6"); // Populate ListView for (int i = 0; i < lst.Count; i++) { ListViewItem lvItem = new ListViewItem(lst[i].ToString()); listView1.Items.Add(lvItem); lvItem.EnsureVisible(); } // Populate TreeView for (int i = 0; i < lst.Count; i++) { TreeNode node = new TreeNode(lst[i].ToString()); if (i % 2 == 0) treeView1.Nodes.Add(node); else treeView1.Nodes[0].Nodes.Add(node); node.EnsureVisible(); } treeView1.ExpandAll(); listView1.AllowDrop = true; treeView1.AllowDrop = true; } } }
源代码下载