ListView
не поддерживает перетаскивание, но вы можете включить его с небольшим количеством кода:
http://support.microsoft.com/kb/822483
Вот пример, который специально выполняет перетаскивание с ListView
на TreeView
(это ссылка «Секс-эксперта», так что просто подождите несколько секунд, а затем прокрутите вниз, где вы найдете ответы):
http://www.experts -exchange.com / Программирование / Языки / .NET / Visual_CSharp / Q_22675010.html
Обновление: Код по ссылке:
- Создание списка и дерева. (В моем примере просмотр списка называется listView1, а просмотр дерева называется tvMain)
- В древовидной структуре установите AllowDrop в true.
- Создать событие ItemDrag в просмотре списка
private void listView1_ItemDrag(object sender, ItemDragEventArgs e)
{
listView1.DoDragDrop(listView1.SelectedItems, DragDropEffects.Copy);
}
В этом примере элементы из списка отображаются в объекте drop.
Теперь создайте событие DragEnter в виде дерева:
private void tvMain_DragEnter(object sender, DragEventArgs e)
{
e.Effect = DragDropEffects.Copy;
}
Это было легко. Теперь начинается самое сложное. Следующий код добавляет выбранные (и перетаскиваемые) элементы списка просмотра к существующему узлу (убедитесь, что у вас есть хотя бы один узел в древовидном представлении, или пример потерпит неудачу!)
Создать событие DragDrop в древовидном представлении:
private void tvMain_DragDrop(object sender, DragEventArgs e)
{
TreeNode n;
if (e.Data.GetDataPresent("System.Windows.Forms.ListView+SelectedListViewItemCollection", false))
{
Point pt = ((TreeView)sender).PointToClient(new Point(e.X, e.Y));
TreeNode dn = ((TreeView)sender).GetNodeAt(pt);
ListView.SelectedListViewItemCollection lvi = (ListView.SelectedListViewItemCollection)e.Data.GetData("System.Windows.Forms.ListView+SelectedListViewItemCollection");
foreach (ListViewItem item in lvi)
{
n = new TreeNode(item.Text);
n.Tag = item;
dn.Nodes.Add((TreeNode)n.Clone());
dn.Expand();
n.Remove();
}
}
}
Чтобы изменить курсор при перетаскивании, необходимо создать событие GiveFeedback для элемента управления ListView:
private void listView1_GiveFeedback(object sender, GiveFeedbackEventArgs e)
{
e.UseDefaultCursors = false;
if (e.Effect == DragDropEffects.Copy)
{
Cursor.Current = new Cursor(@"myfile.ico");
}
}
myfile.ico
должен находиться в том же каталоге, что и файл .exe.
Это просто простой пример. Вы можете расширить его так, как вам нравится.