Можно ли перетащить из ListView в TreeView в Winforms? - PullRequest
3 голосов
/ 18 февраля 2011

Если это невозможно, я также могу использовать 2 элемента управления TreeView. У меня просто не будет иерархии во втором элементе управления TreeView. Это будет действовать как некое хранилище.

Любой пример кода или учебное пособие будет очень полезным.

1 Ответ

6 голосов
/ 18 февраля 2011

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.

Это просто простой пример. Вы можете расширить его так, как вам нравится.

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