这个问题与Reorder / move / dragdrop ListViewItems within the same ListView Control in C# Windows Forms没有任何共同之处,因为它只适用于大/小图标视图模式!
我在这里找到了一些不错的小代码:
http://snipplr.com/view/33427/
using System.Drawing;
using System.Windows.Forms;
namespace System.Windows.Forms // May need to set to something else
{
/// <summary>
/// A ListView with DragDrop reordering.
/// <see cref="http://support.microsoft.com/kb/822483/en-us"/>
/// </summary>
public class ListViewWithReordering : ListView
{
protected override void OnItemDrag(ItemDragEventArgs e)
{
base.OnItemDrag(e);
//Begins a drag-and-drop operation in the ListView control.
this.DoDragDrop(this.SelectedItems, DragDropEffects.Move);
}
protected override void OnDragEnter(DragEventArgs drgevent)
{
base.OnDragEnter(drgevent);
int len = drgevent.Data.GetFormats().Length - 1;
int i;
for (i = 0; i <= len; i++)
{
if (drgevent.Data.GetFormats()[i].Equals("System.Windows.Forms.ListView+SelectedListViewItemCollection"))
{
//The data from the drag source is moved to the target.
drgevent.Effect = DragDropEffects.Move;
}
}
}
protected override void OnDragDrop(DragEventArgs drgevent)
{
base.OnDragDrop(drgevent);
//Return if the items are not selected in the ListView control.
if (this.SelectedItems.Count == 0)
{
return;
}
//Returns the location of the mouse pointer in the ListView control.
Point cp = this.PointToClient(new Point(drgevent.X, drgevent.Y));
//Obtain the item that is located at the specified location of the mouse pointer.
ListViewItem dragToItem = this.GetItemAt(cp.X, cp.Y);
if (dragToItem == null)
{
return;
}
//Obtain the index of the item at the mouse pointer.
int dragIndex = dragToItem.Index;
ListViewItem[] sel = new ListViewItem[this.SelectedItems.Count];
for (int i = 0; i <= this.SelectedItems.Count - 1; i++)
{
sel[i] = this.SelectedItems[i];
}
for (int i = 0; i < sel.GetLength(0); i++)
{
//Obtain the ListViewItem to be dragged to the target location.
ListViewItem dragItem = sel[i];
int itemIndex = dragIndex;
if (itemIndex == dragItem.Index)
{
return;
}
if (dragItem.Index < itemIndex)
itemIndex++;
else
itemIndex = dragIndex + i;
//Insert the item at the mouse pointer.
ListViewItem insertItem = (ListViewItem)dragItem.Clone();
this.Items.Insert(itemIndex, insertItem);
//Removes the item from the initial location while
//the item is moved to the new location.
this.Items.Remove(dragItem);
}
}
}
}
其基于/改编自X1 E2 F1 X。
很遗憾,代码下载不起作用。
然而,这段代码是如何使用的呢?简单地把它粘贴到我的窗体类中是行不通的。我想这段代码只是简单地覆盖了窗体中所有列表视图的所有拖动事件吧?!
对不起,这是一个愚蠢的问题,但我如何使用这个代码?
3条答案
按热度按时间qvsjd97n1#
有些人很友好地采用了标准的.NET ListView控件,并使用了一种叫做继承的东西来制作他们自己的版本,使其具有额外的功能。您应该仔细阅读它,这是一件很有用的事情。
要使它在项目中工作,您需要按如下所述添加此类。
我假设您使用的是Visual Studio,但您没有提到其他方面。
1.在右侧的解决方案资源管理器中,右键单击您的解决方案,然后转到“添加”〉“类”。
1.将类命名为您喜欢的任何名称(ListViewWithReordering.cs最合适),然后打开该文件。将所有这些代码粘贴到该文件中。
1.在顶部显示
namespace
的地方,您需要编辑它以匹配您自己的程序名称空间。1.构建项目。
1.在左侧的工具箱中,您通常可以看到所有标准.NET控件,在顶部应该有一个部分现在包含
ListViewWithReordering
。1.将此控件拖到项目上。
1.完成!像其他ListView控件一样使用它。其余的应该会自动工作(只要这个类确实可靠)。
ws51t4hk2#
我创建了一个拖放设计的例子,点击下面的链接下载该项目。有问题再问。
https://drive.google.com/file/d/0B21l6Fz0byBMSi1VTm52V2E4VVE/view?usp=sharing&resourcekey=0-jNA3sA85A6lygH3TyISstA
9avjhtql3#
首先将此类添加到项目中。
然后,如果您已经从窗体设计器中获得了一个列表视图,请转到窗体构造函数的InitializeComponent()方法。在该方法中,您的列表视图被声明为:
将此声明更改为: