C# ListView 拖放

C# ListView Drag and Drop

我正在尝试将 ListViewItem 从一个 ListView 拖放到 Windows 表单应用程序中的另一个。我有两个 ListViewslvImageFolderlvWebServer。我正在尝试从 lvImageFolder 拖动到 lvWebServer

我的代码如下所示:

private void lvImageFolder_MouseDown(object sender, MouseEventArgs e)
{
    if (e.Button == MouseButtons.Left)
    {
        txtCursor.Text = Cursor.Position.ToString();
        lvWebServer.DoDragDrop(lvImageFolder.Items[0].Text, DragDropEffects.Move);
    }

}

private void lvWebServer_DragDrop(object sender, DragEventArgs e)
{
    string dragToItem = e.Data.GetData(DataFormats.Text).ToString();

    lvWebServer.Items.Add(dragToItem);
}

private void lvWebServer_DragEnter(object sender, DragEventArgs e)
{
    if (e.Data.GetDataPresent(DataFormats.Text))
    {
        e.Effect = DragDropEffects.Move;
    }
    else
    {
        e.Effect = DragDropEffects.None;
    }   
}

我遇到的问题是字符串 dragToItem 为空。我也尝试将序列化对象传递给 DoDragDrop 方法,但这只给了我一些问题。

谁能解释一下这个问题?

因为您从列表视图项目位置 [0] 开始拖放,并且它可能是一个空项目。您应该开始拖放列表视图的选定项目,例如:

private void lvImageFolder_MouseDown(object sender, MouseEventArgs e)
{
    if (e.Button == MouseButtons.Left)
    {
        //txtCursor.Text = Cursor.Position.ToString();
        if (lvImageFolder.SelectedItems.Count > 0)
        {
            var lst = new List<string>();
            foreach (ListViewItem item in lvImageFolder.SelectedItems)
            {
                lst.Add(item.Text);
            }
            lvWebServer.DoDragDrop(lst, DragDropEffects.Move);
        }
    }

}

private void lvWebServer_DragDrop(object sender, DragEventArgs e)
{
    List<string> lst = e.Data.GetData(typeof(List<string>)) as List<string>;
    foreach (var item in lst)
    {
        lvWebServer.Items.Add(item);
    }

}

private void lvWebServer_DragEnter(object sender, DragEventArgs e)
{
    if (e.Data.GetDataPresent(typeof(List<string>)))
    {
        e.Effect = DragDropEffects.Move;
    }
    else
    {
        e.Effect = DragDropEffects.None;
    }
}

更改下面的行,但正如 adv12 所写,始终复制第一项:

lvWebServer.DoDragDrop(lvImageFolder.Items[0].ToString(), DragDropEffects.Move);

将其更改为以下代码以拖放所选元素:

lvWebServer.DoDragDrop(lvImageFolder.SelectedItem, DragDropEffects.Move);