我有一个小文件浏览器应用程序[WINFORMS],我使用ListView Control来探索项目 因此listView显示当前地址[来自本地计算机]的文件和文件夹 我需要启用拖放功能,让文件/文件夹易于移动/复制到同一地址中的另一个文件夹。 每个项目都有一些特性:
"13.45 MB"
,对于一个文件夹,它将会是string.Empty
[但是,有几种方法可以知道它是文件还是文件夹]。
我已经看过很多关于如何在listview中使用drag& drop的教程,但它就像是从Windows文件资源管理器到ListView,或者从ListView到另一个,但在我的情况下我需要知道如何拖放同一个ListView 。
我已启用ListView的AllowDrop属性。并激活了以下功能:
private void listView1_DragDrop(object sender, DragEventArgs e)
{
}
private void listView1_DragEnter(object sender, DragEventArgs e)
{
}
private void listView1_ItemDrag(object sender, ItemDragEventArgs e)
{
}
我试着用这个:
private void listView1_DragDrop(object sender, DragEventArgs e)
{
ListViewItem item = (ListViewItem)e.Data.GetData(typeof(ListViewItem)); //this should be the target item (FOLDER)
StringBuilder s = new StringBuilder();
foreach (ListViewItem i in listView1.SelectedItems)
{
s.AppendLine(i.Text);
}
MessageBox.Show("DRAGGED ITEM : " + s.ToString() + "TARGET ITEM : " + item.Text);
}
private void listView1_DragEnter(object sender, DragEventArgs e)
{
e.Effect = DragDropEffects.Copy;
}
private void listView1_MouseDown(object sender, MouseEventArgs e)
{
var item = listView1.GetItemAt(e.X, e.Y);
if (item != null)
{
listView1.DoDragDrop(item, DragDropEffects.Copy);
}
}
在listView1_MouseDown
我得到了鼠标指向的项目,但它在我删除拖动的项目之前给了我项目,所以如果我拖动一个名为&#34的文件夹; SWImg"到文件夹" ODDFiles" ,messageBox显示"SWImg - SWImg"
然后我将listView1_MouseDown
替换为listView1_ItemDrag
:
private void listView1_ItemDrag(object sender, ItemDragEventArgs e)
{
if (e.Item != null)
{
listView1.DoDragDrop(e.Item, DragDropEffects.Copy);
}
}
同样的结果:S。
答案 0 :(得分:0)
我已经明白了。
private void listView1_DragDrop(object sender, DragEventArgs e)
{
if (listView1.SelectedItems.Count == 0) { return; }
Point p = listView1.PointToClient(MousePosition);
ListViewItem item = listView1.GetItemAt(p.X, p.Y);
if (item == null) { return; }
List<ListViewItem> collection = new List<ListViewItem>();
foreach (ListViewItem i in listView1.SelectedItems)
{
collection.Add((ListViewItem)i.Clone());
}
if ((e.Effect & DragDropEffects.Move) == DragDropEffects.Move)
{
Thread thMove = new Thread(unused => PasteFromMove(item.ToolTipText, collection));
thMove.Start();
}
else
{
Thread thCopy = new Thread(unused => PasteFromCopy(item.ToolTipText, collection));
thCopy.Start();
}
}
private void listView1_DragOver(object sender, DragEventArgs e)
{
if ((e.KeyState & 8) == 8)
e.Effect = DragDropEffects.Copy;
else
e.Effect = DragDropEffects.Move;
}
private void listView1_ItemDrag(object sender, ItemDragEventArgs e)
{
listView1.DoDragDrop(e.Item,DragDropEffects.All);
}