C# ListView 拖放
C# ListView Drag and Drop
我正在尝试将 ListViewItem
从一个 ListView
拖放到 Windows 表单应用程序中的另一个。我有两个 ListViews
:lvImageFolder
和 lvWebServer
。我正在尝试从 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);
我正在尝试将 ListViewItem
从一个 ListView
拖放到 Windows 表单应用程序中的另一个。我有两个 ListViews
:lvImageFolder
和 lvWebServer
。我正在尝试从 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);