将列表视图项从一个列表视图拖放到另一个列表视图时,有没有办法获取列表视图项是从哪个列表视图拖动的
本文关键字:视图 列表 有没有 获取 拖动 一个 拖放 另一个 | 更新日期: 2023-09-27 18:33:44
>编辑:我认为我没有以正确的方式提出我的问题。我将对此进行更多研究,但我会留下这个问题,以防它对其他人有用。
原文:我正在开发一个具有两个文件浏览器(一个远程浏览器和一个本地浏览器(的应用程序,允许用户简单地在两者之间拖放文件。
为了允许用户将文件拖动到列出的文件夹中,我需要突出显示文件夹的 ListViewItem 以使用 ListView.FocusedItem
从中获取目录,并使用ListViewItem.Selected = true
使其向用户突出显示,但是为了确保一次只在用户拖动到的一侧选择一个项目, 当调用 DragOver 事件时,我不得不调用ListView.SelectedItems.Clear()
。
这样做的结果是,每当将任何内容拖动到控件上时都会调用 DragOver 事件,因此,如果用户选择要传输的多个项目,一旦他们拖动它们,它们都会被清除,除了用户实际拖动的项,这让我想到了我的问题 - 无论如何都可以获取在 DragOver 事件期间从哪个 ListView 中拖动 ListViewItem ?我已经检查了MSDN上的DragEventArgs,但似乎没有什么适合我的目的。
您面临三个挑战:
- 了解数据来自何处
- 拖动多个项目,或者也许阻止它??(*)
- 拖动时不会丢失所选内容
让我们从最后一个开始:你使用了正确的事件吗?请勿使用 MouseDown
事件! ListView
有一个避免选择问题的ItemDrag
事件。
另外两个是通过拖动ListViewItems
数组来解决的。这是一个从listView2
拖动到listView1
的工作示例:
private void listView2_ItemDrag(object sender, ItemDragEventArgs e)
{
// stuff all seleted items into an array
var Items = listView2.SelectedItems.Cast<ListViewItem>().ToArray();
DataObject data = new DataObject(DataFormats.FileDrop, Items);
data.SetData(Items);
listView1.DoDragDrop(data, DragDropEffects.Move); // move or copy?
}
private void listView1_DragEnter(object sender, DragEventArgs e)
{
// if we receive an array of ListViewItems show we are ready to move (or copy?)
if (e.Data.GetDataPresent(typeof(ListViewItem[]))) e.Effect = DragDropEffects.Move;
}
private void listView1_DragDrop(object sender, DragEventArgs e)
{
var data = e.Data.GetData(typeof(ListViewItem[]));
ListViewItem[] items = data as ListViewItem[];
// data ok?
if (items != null)
// now loop over the array..
foreach (ListViewItem lvi in items)
{
// do stuff.. here we can check where we come from:
listView1.Items.Add(lvi.Text + " coming from " + lvi.ListView.Name)
}
}
请注意,我注意
- 拖动所有选定项目
- 不仅是文本,还有实际
ListViewItems
因为我们在DragDrop
中收到真实的ListViewItems
所以我们可以使用它们的ListView
属性来测试它们来自哪里:
(*( 顺便说一句:如果你只想拖动一个项目,为什么不做ListView.MultiSelect = false
?