0

我有以下情况:

在我的 Windows 窗体应用程序中,我有两个 ListView 控件,我需要将一个项目从 ListView1 拖放到 ListView2。
当我选择 ListView1 上的项目并拖动到 ListView2 的项目上时,我想突出显示我将鼠标放在 ListView2 中的项目,以指示 ListView2 的哪个项目接收到下降。

下面是我关于ListView2.DragOver事件的实际代码:

private void listView2_DragOver(object sender, DragEventArgs e)
{
    Point pto = new Point(e.X, e.Y);
    e.Effect = DragDropEffects.Move;            
    Point localpoint = listView2.PointToClient(pto);
    ListViewItem item = listView2.GetItemAt(localpoint.X, localpoint.Y);
    listView2.Items[item.Index].Focused = true;
    listView2.Items[item.Index].Selected = true;
}

这段代码有两个问题:

a) 该GetItemAt()方法未返回有效项(返回 null)。我已经尝试将坐标源更改为Cursor.Position,但它也不起作用。在此事件中如何通过鼠标位置捕获该项目?

b)即使我更改了项目的索引listView2.Items[item.Index],也没有任何内容突出显示或选择listview2
拖动项目时我应该使用什么来突出显示或选择项目?

如果您能帮助我,我将不胜感激。

4

1 回答 1

0

使用ListView.HitTest方法可能更简单:

在给定 x 和 y 坐标的情况下提供项目信息

您还需要检查是否:

  • 该坐标处的项目不为空(光标位置下没有项目)。
  • 该项目已被选中。如果是,请不要再设置它,因为它会导致闪烁。

private void listView2_DragOver(object sender, DragEventArgs e)
{
    e.Effect = DragDropEffects.Move;
    var item = listView2.HitTest(listView2.PointToClient(new Point(e.X, e.Y))).Item;
    if (item != null && (!item.Selected)) item.Selected = true;
}

ListView.View未指定模式。如果您有.View = View.Details;,您可能更喜欢设置FullRowSelect = true:DragOver效果要好得多。

于 2020-04-09T02:35:06.667 回答