C# 列表视图拖放 - 多种拖放方法
本文关键字:拖放 方法 视图 列表 | 更新日期: 2023-09-27 17:56:37
我有两个ListView。一个具有要拖到另一个的选项。这是"字段"列表视图。另一个是"构建器"列表视图。我遇到的问题是,我无法在用户拖动它的位置插入 ListViewItem,如果他们将其拖动到空白,也将其添加到底部。此时我可以做一个或另一个。我需要一个解决方案。
private void builder_DragEnter(object sender, DragEventArgs e)
{
e.Effect = DragDropEffects.Move;
}
private void fields_DragEnter(object sender, DragEventArgs e)
{
e.Effect = DragDropEffects.Move;
}
private void fields_ItemDrag(object sender, ItemDragEventArgs e)
{
fromBuilder = false;
fields.DoDragDrop(e.Item, DragDropEffects.Move);
}
private void builder_ItemDrag(object sender, ItemDragEventArgs e)
{
fromBuilder = true;
builder.DoDragDrop(e.Item, DragDropEffects.Move);
}
private void builderAndFields_DragDrop(object sender, DragEventArgs e)
{
ListViewItem i = new ListViewItem();
i = e.Data.GetData(typeof(ListViewItem)) as ListViewItem;
// Since this function works for both the builder and the fields,
// we have to check to see where we are dropping, the sender
// is the ListView we are dropping onto
if (sender.Equals(builder))
{
ListViewItem c = new ListViewItem();
c = (ListViewItem)i.Clone();
Point cp = builder.PointToClient(new Point(e.X, e.Y));
Console.WriteLine("cp: " + cp);
ListViewItem dragToItem = builder.GetItemAt(cp.X, cp.Y);
Console.WriteLine("dragToItem: " + dragToItem);
int dropIndex = dragToItem.Index;
// Now, we have to check to see if we are reordering or adding
// So, we check the flag to see if the dragDrop was initiated
// on the builder or on the fields ListView
if (fromBuilder)
{
builder.Items.Insert(dropIndex, c);
builder.Items.Remove(i);
}
else
{
// ## Problem - Attempted solution ##
if (String.IsNullOrWhiteSpace(dragToItem.ToString()))
builder.Items.Add(c);
else
{
Console.WriteLine(dropIndex);
builder.Items.Insert(dropIndex, c);
}
}
}
// If the sender is the fields listView, the user is trying to remove
// the item from the builder.
else
{
builder.Items.Remove(i);
}
}
谢谢你的评论汉斯。这是非常有帮助的!这是我遇到的两个问题的解决方案。另一个是能够对列表视图重新排序并将项目拖到列表底部。
// Generic DragEnter
private void ddEnter_DragEnter(object sender, DragEventArgs e)
{
e.Effect = DragDropEffects.Move;
}
// ItemDrag Events
private void fields_ItemDrag(object sender, ItemDragEventArgs e)
{
fromBuilder = false;
fields.DoDragDrop(e.Item, DragDropEffects.Move);
}
private void builder_ItemDrag(object sender, ItemDragEventArgs e)
{
fromBuilder = true;
packetBuilder.DoDragDrop(e.Item, DragDropEffects.Move);
}
// DragDrop Events
private void builderAndFields_DragDrop(object sender, DragEventArgs e)
{
ListViewItem i = new ListViewItem();
i = e.Data.GetData(typeof(ListViewItem)) as ListViewItem;
// Since this function works for both the builder and the fields,
// we have to check to see where we are dropping, the sender
// is the ListView we are dropping onto
Console.WriteLine(sender.Equals(packetBuilder));
if (sender.Equals(packetBuilder))
{
ListViewItem c = new ListViewItem();
c = (ListViewItem)i.Clone();
Point cp = packetBuilder.PointToClient(new Point(e.X, e.Y));
// Now, we have to check to see if we are reordering or adding
// So, we check the flag to see if the dragDrop was initiated
// on the builder or on the fields ListView
Console.WriteLine(fromBuilder);
if (fromBuilder)
{
if (packetBuilder.HitTest(cp).Location.ToString() == "None")
{
packetBuilder.Items.Add(c);
packetBuilder.Items.Remove(i);
}
else
{
ListViewItem dragToItem = packetBuilder.GetItemAt(cp.X, cp.Y);
int dropIndex = dragToItem.Index;
packetBuilder.Items.Insert(dropIndex, c);
packetBuilder.Items.Remove(i);
}
}
else
{
if (packetBuilder.HitTest(cp).Location.ToString() == "None")
packetBuilder.Items.Add(c);
else
{
ListViewItem dragToItem = packetBuilder.GetItemAt(cp.X, cp.Y);
int dropIndex = dragToItem.Index;
packetBuilder.Items.Insert(dropIndex, c);
}
}
}
// If the sender is the fields listView, the user is trying to remove
// the item from the builder.
else
{
packetBuilder.Items.Remove(i);
}
}