将列表视图项从一个列表视图拖放到另一个列表视图时,有没有办法获取列表视图项是从哪个列表视图拖动的

本文关键字:视图 列表 有没有 获取 拖动 一个 拖放 另一个 | 更新日期: 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