Как выделить элемент ListView на событие DragOver? - PullRequest
0 голосов
/ 09 апреля 2020

У меня следующая ситуация:

В моем приложении Windows Forms у меня есть два элемента управления 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() не возвращает допустимый элемент (возвращает ноль). Я уже пытался изменить источник координат на Cursor.Position, но это тоже не работает. Как я мог поймать предмет по расположению мыши в этом событии?

b) Даже если я изменил индекс предмета в listView2.Items[item.Index], ничего не выделяется и не выделяется в listview2.
Что мне следует сделать использовать, чтобы выделить или выбрать элемент при перетаскивании его?

Если бы вы могли мне помочь, я был бы очень признателен.

1 Ответ

0 голосов
/ 09 апреля 2020

Вероятно, проще использовать 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 гораздо лучше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...