文件名称:C# ListView 支持分组时拖拉排序的控件
文件大小:8KB
文件格式:CS
更新时间:2012-04-23 07:50:20
ListView 持分组 拖拉排序
using System;
using System.Drawing;
using System.Windows.Forms;
using System.Collections.Generic;
namespace WindowsFormsApplication1
{
class DragItemListView:ListView
{
public DragItemListView()
{
SetStyle(ControlStyles.DoubleBuffer | ControlStyles.OptimizedDoubleBuffer | ControlStyles.AllPaintingInWmPaint, true);
UpdateStyles();
this.MultiSelect = false;
this.ListViewItemSorter = new ListViewIndexComparer();
if (OSFeature.Feature.IsPresent(OSFeature.Themes))
{
this.AllowDrop = true;
this.ItemDrag += new ItemDragEventHandler(DragItemListView_ItemDrag);
this.DragEnter += new DragEventHandler(DragItemListView_DragEnter);
this.DragLeave += new EventHandler(DragItemListView_DragLeave);
this.DragOver += new DragEventHandler(DragItemListView_DragOver);
this.DragDrop += new DragEventHandler(DragItemListView_DragDrop);
}
}
void DragItemListView_DragDrop(object sender, DragEventArgs e)
{
// Retrieve the index of the insertion mark;
int targetIndex = this.InsertionMark.Index;
// If the insertion mark is not visible, exit the method.
if (targetIndex == -1)
{
return;
}
// If the insertion mark is to the right of the item with
// the corresponding index, increment the target index.
// Retrieve the dragged item.
ListViewItem draggedItem =
(ListViewItem)e.Data.GetData(typeof(ListViewItem));
// Insert a copy of the dragged item at the target index.
// A copy must be inserted before the original item is removed
// to preserve item index values.
ListViewItem NewItem = (ListViewItem)draggedItem.Clone();
if (draggedItem.Index < targetIndex)
{
if (targetIndex - draggedItem.Index > 1)
NewItem.Group = this.Items[targetIndex - 1].Group;
else
NewItem.Group = this.Items[targetIndex].Group;
}
else
{
if (draggedItem.Index - targetIndex > 1)
NewItem.Group = this.Items[targetIndex].Group;
else
NewItem.Group = this.Items[targetIndex - 1].Group;
}
if (this.InsertionMark.AppearsAfterItem)
{
targetIndex++;
}
this.Items.Insert(targetIndex, NewItem);
// Remove the original copy of the dragged item.
this.Items.Remove(draggedItem);
}
void DragItemListView_DragOver(object sender, DragEventArgs e)
{
// Retrieve the client coordinates of the mouse pointer.
Point targetPoint =
this.PointToClient(new Point(e.X, e.Y));
// Retrieve the index of the item closest to the mouse pointer.
//int targetIndex = this.InsertionMark.NearestIndex(targetPoint);
int targetIndex = GetNearItem(targetPoint).Index;
// Confirm that the mouse pointer is not over the dragged item.
if (targetIndex > -1)
{
// Determine whether the mouse pointer is to the left or
// the right of the midpoint of the closest item and set
// the InsertionMark.AppearsAfterItem property accordingly.
Rectangle itemBounds = this.GetItemRect(targetIndex);
if (targetPoint.X > itemBounds.Left + (itemBounds.Width / 2))
{
this.InsertionMark.AppearsAfterItem = true;
}
else
{
this.InsertionMark.AppearsAfterItem = false;
}
}
// Set the location of the insertion mark. If the mouse is
// over the dragged item, the targetIndex value is -1 and
// the insertion mark disappears.
this.InsertionMark.Index = targetIndex;
}
void DragItemListView_DragLeave(object sender, EventArgs e)
{
this.InsertionMark.Index = -1;
}
void DragItemListView_ItemDrag(object sender, ItemDragEventArgs e)
{
this.DoDragDrop(e.Item, DragDropEffects.Move);
}
void DragItemListView_DragEnter(object sender, DragEventArgs e)
{
e.Effect = e.AllowedEffect;
}
private class ListViewIndexComparer : System.Collections.IComparer
{
public int Compare(object x, object y)
{
return ((ListViewItem)x).Index - ((ListViewItem)y).Index;
}
}
///