.net 如何在DragDrop事件期间更改ListView中的焦点项?

rdlzhqv9  于 2022-12-01  发布在  .NET
关注(0)|答案(2)|浏览(119)

我有一个带有拖放功能的ListView。我希望拖放后拖动的项目保持选中状态。
我有这个代码(用于拖放)

private void commandListView_DragDrop(object sender, DragEventArgs e)
{
    Point point = commandListView.PointToClient(new Point(e.X, e.Y));
    int index = 0;

    try
    {
        index = commandListView.GetItemAt(point.X, point.Y).Index;
    }
    catch (Exception)
    {
    }

    if (index < 0)
    {
        index = commandListView.Items.Count - 1;
    }

    ListViewItem data = e.Data.GetData(typeof(ListViewItem)) as ListViewItem;
    commandListView.Items.Remove(data);
    commandListView.Items.Insert(index, data);
}

我试着用这个来再次选择项目,但是不起作用

data.Selected = true;
data.Focused = true;

然后,我进行了测试,看看是否可以将焦点放在ListView中的第一项上

commandListView.Items[0].Selected = true;
commandListView.Items[0].Focused = true;

但是它也不起作用,选定的项目不会改变。它总是拖放之前拖动的项目所在的旧索引。
附言我用的是WinForms

@更新

我已经试过用

commandListView.Focus();

但没有成功
为了澄清拖放是在同一个ListView中发生的,我拖动项来更改它们的顺序。

cnjp1d6j

cnjp1d6j1#

我找到了解决办法;我正在使用MouseDown事件启动DragDrop操作。
现在我使用ItemDrag事件,一切都很好,实际上我甚至不需要聚焦项目,它是自动完成的。

py49o6xq

py49o6xq2#

对于那些仍在努力寻找解决方案的人:

int counter = ...; // your code to find index of wanted ListView-Item.

ListVieuwName.Focus(); //First: activate focus on the entire ListView.

ListVieuwName.Items[counter].Selected = true; //Next: select your wanted ListView-Item.

这个应该够了...

相关问题