WinForm控件间拖动之TreeView与ListView之间的拖动(实践篇)

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

源代码下载

posted @ 2013-06-01 17:49  焦涛  阅读(2664)  评论(0)    收藏  举报