.NET 2.0 C # Treeview Перетаскивание в TreeNodes - PullRequest
1 голос
/ 08 сентября 2010

Я заинтересован в захвате события перетаскивания, которое начнется с того, что пользователь перетаскивает существующий TreeNode где-то в TreeView. Пока пользователь перетаскивает TreeNode, меня интересует захват, когда узел перетаскивается между двумя узлами дерева. Когда пользователь делает это, я хотел отобразить хеш-метку между узлами дерева, чтобы указать, будет ли узел отброшен в узле как дочерний или как родной элемент. Этот хеш-знак будет отображаться либо: - под узлом назначения (чтобы указать, что узел источника будет отброшен как дочерний узел узла назначения ИЛИ ЖЕ - под узлом назначения слева (чтобы указать, что узел источника будет отброшен как родной узел узла назначения), до или после ...

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

        int threshold = 8;  //Joe(hack)
        Point mouseLocation = mouseLocation = treeViewConditions.PointToClient(new Point(e.X, e.Y - threshold));
        TreeNode topNode = treeViewConditions.GetNodeAt(mouseLocation);
        mouseLocation = treeViewConditions.PointToClient(new Point(e.X + threshold, e.Y));
        TreeNode bottomNode = treeViewConditions.GetNodeAt(mouseLocation);

        if (topNode != null && bottomNode == null)
        {
            textBoxDescription.Text = "handling top node";
        }
        else if (topNode == null && bottomNode != null)
        {
            textBoxDescription.Text = "handling bottom node";
        }
        else if (topNode != null && bottomNode != null)
        {
            if (topNode != bottomNode)
            {
                textBoxDescription.Text = "between!";
            }
            else if (topNode == bottomNode)
            {
            }
        }

Однако, делая это, он просто чувствует себя грязным. Мне интересно, знал ли кто-нибудь о лучшем способе сделать это.

За тонну заранее спасибо!

Ответы [ 2 ]

2 голосов
/ 08 сентября 2010

Рисование «хеш-метки» будет настоящей проблемой.TreeView имеет свойство DrawMode, но его событие DrawItem не позволяет рисовать между узлами.

Вам необходимо справиться с этим, изменив курсор, чтобы указать, что произойдет.Используйте событие GiveFeedback, присвойте e.UseCustomCursors значение false и присвойте Cursor.Current пользовательский курсор, который указывает операцию.

1 голос
/ 08 сентября 2010

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

...