2010-07-26 3 views
7

Я пытаюсь реализовать перестановку строк и перетаскивание C# со списком, который затем обновит базу данных SQL с текущим порядком строк. Я столкнулся с некоторыми фрагментами кода в Интернете (один из этого веб-сайта, который реализовал класс «var»), но ни один из них не работает с моими потребностями. Мне не нужна помощь в обновлении базы данных, так как у меня есть хорошая идея, как бы я это сделал, но, похоже, не может заставить строку переупорядочить работу правильно, любой ввод будет оценен.C# Listview Drag and Drop Строки

-Спасибо

м &

ответ

14
  1. Убедитесь, что для параметра AllowDragDrop установлено значение true.

2 Реализация обработчиков по крайней мере, эти три события

 private void myList_ItemDrag(object sender, ItemDragEventArgs e) 
     { 
      DoDragDrop(e.Item, DragDropEffects.Link); 
     } 

     private void myList_DragEnter(object sender, DragEventArgs e) 
     { 
      e.Effect = DragDropEffects.Link; 
     } 

     private void myList_DragDrop(object sender, DragEventArgs e) 
     { 
      // do whatever you need to reorder the list. 
     } 

Получение индекса строки вы упали на может выглядеть как

Point cp = myList.PointToClient(new Point(e.X, e.Y)); 
ListViewItem dragToItem = myList.GetItemAt(cp.X, cp.Y); 
int dropIndex = dragToItem.Index; 
+3

+1 для образца поиска строки. –

+0

Спасибо, похоже, метод myList_DragDrop потребует некоторого вмешательства. . Насколько мне известно, нам нужно будет удалить выбранный элемент из списка, а затем снова добавить его в новый индекс (где мы хотим его удалить?). Кроме того, нам также пришлось бы сдвинуть вниз строку, в которую мы попадаем один ... есть ли какое-то событие, которое справляется с этим? – Mike

+0

Привет, метод ItemDrag проходит во всем элементе управления ListView в методе DragDrog, в котором я не могу захватить определенный элемент, который я начал перетаскивать, любые предложения? private void empList_ItemDrag (отправитель объекта, ItemDragEventArgs e) {DoDragDrop (e.Item, DragDropEffects.Link); empList.Items.RemoveAt (empList.SelectedIndices [0]); } private void empList_DragDrop (отправитель объекта, DragEventArgs e) {Point cp = empList.PointToClient (новая точка (e.X, e.Y)); ListViewItem dragToItem = empList.GetItemAt (cp.X, cp.Y); int dropIndex = dragToItem.Index; } – Mike

0

Я знаю, что это не ListView специфична, но у меня есть пример кода для реализации ряда перетаскивания из/в DataGridView. Некоторые из них, очевидно, контролируют специфическими, другой код на самом деле довольно общий (например, решая, когда его перетащить):

http://adamhouldsworth.blogspot.com/2010/01/datagridview-multiple-row-drag-drop.html

Совсем забыл о том, что ListView уже позволяет перетащить капание!

Я также могу добавить некоторую теорию - когда падение происходит на вашем контроле, вам нужно нажать тест на эти координаты (вероятно, метод, называемый HitTest), на ListView, чтобы увидеть, какая строка была поражена, это является основой для где нужно вставить строку, перетаскиваемую.

Несвязанный - это то, что var класс, возможно, новое ключевое слово var в C#?

+0

Привет Адам, Мы думали, что ListView позволяет перетащить -dropping, но помимо свойства allowdrop = true, мы не сможем найти какую-либо автоматическую логику, которая перемещает строки вокруг нас. Вот почему это похоже на то, что он реализуется с помощью событий (например, выше). Атрибут var был поставлен на вопрос, когда мы посмотрели на следующее сообщение: http://stackoverflow.com/questions/643275/c-drag-drop-in-listview – Mike

+0

@Mike Да, я понял, когда увидел другую запись , поэтому я удалил соответствующую часть моего ответа. Я не понял, что ListView имеет метод GetItemAt - для вас инкапсулирует тест на попадание. Используя это, нужно было только удалить строку и вставить ее в указанный индекс - 1. Кроме того, в этом сообщении указано новое ключевое слово var - просто означает, что компилятор отображает для вас тип - синтаксический сахар. –

+0

Привет, метод ItemDrag проходит во всем элементе управления ListView в методе DragDrog, в котором я не могу захватить определенный элемент, который я начал перетаскивать, любые предложения? private void empList_ItemDrag (объект отправитель, ItemDragEventArgs e) { DoDragDrop (e.Item, DragDropEffects.Link); empList.Items.RemoveAt (empList.SelectedIndices [0]); } частная пустота empList_DragDrop (объект отправителя, DragEventArgs е) { точка ф = empList.PointToClient (новая точка (e.X, e.Y)); ListViewItem dragToItem = empList.GetItemAt (cp.X, cp.Y); int dropIndex = dragToItem.Index; } – Mike