上篇我以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;         }     } }


​源代码下载​