C# ListView添加DragDrop

先建立好ListView,ImageList,
然后编写一个比较类
在就是添加DragDrop事件了
具体实现看代码吧

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
        InitializeListView();
    }
    // 初始化listView1.
    private void InitializeListView()
    {
        listView1.ListViewItemSorter = new ListViewIndexComparer();
        //初始化插入标记
        listView1.InsertionMark.Color = Color.Red;
        //
        listView1.AllowDrop = true;
    }

    // 当一个项目拖拽是启动拖拽操作
    private void listView1_ItemDrag(object sender, ItemDragEventArgs e)
    {
        listView1.DoDragDrop(e.Item, DragDropEffects.Move);
    }

    private void listView1_DragEnter(object sender, DragEventArgs e)
    {
        e.Effect = e.AllowedEffect;
    }

    //像拖拽项目一样移动插入标记
    private void listView1_DragOver(object sender, DragEventArgs e)
    {
        // 获得鼠标坐标
        Point point = listView1.PointToClient(new Point(e.X, e.Y));
        // 返回离鼠标最近的项目的索引
        int index = listView1.InsertionMark.NearestIndex(point);
        // 确定光标不在拖拽项目上
        if (index > -1)
        {
            Rectangle itemBounds = listView1.GetItemRect(index);
            if (point.X > itemBounds.Left + (itemBounds.Width / 2))
            {
                listView1.InsertionMark.AppearsAfterItem = true;
            }
            else
            {
                listView1.InsertionMark.AppearsAfterItem = false;
            }
        }
        listView1.InsertionMark.Index = index;
    }

    // 当鼠标离开控件时移除插入标记
    private void listView1_DragLeave(object sender, EventArgs e)
    {
        listView1.InsertionMark.Index = -1;
    }

    // 将项目移到插入标记所在的位置
    private void listView1_DragDrop(object sender, DragEventArgs e)
    {
        // 返回插入标记的索引值
        int index = listView1.InsertionMark.Index;
        // 如果插入标记不可见,则退出.
        if (index == -1)
        {
            return;
        }
        // 如果插入标记在项目的右面,使目标索引值加一
        if (listView1.InsertionMark.AppearsAfterItem)
        {
            index++;
        }

        // 返回拖拽项
        ListViewItem item = (ListViewItem)e.Data.GetData(typeof(ListViewItem));
        //在目标索引位置插入一个拖拽项目的副本 
        listView1.Items.Insert(index, (ListViewItem)item.Clone());
        // 移除拖拽项目的原文件
        listView1.Items.Remove(item);
    }

    // 对ListView里的各项根据索引进行排序
    private class ListViewIndexComparer : System.Collections.IComparer
    {
        public int Compare(object x, object y)
        {
            return ((ListViewItem)x).Index - ((ListViewItem)y).Index;
        }
    }
}


没有更多推荐了,返回首页