.NET 2.0 C#Treeview在TreeNodes中拖放

时间:2010-09-07 20:44:33

标签: c# .net treeview drag-and-drop nodes

我有兴趣捕获一个拖放事件,该事件将从用户在TreeView中的某个位置拖动现有TreeNode开始。当用户拖动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 个答案:

答案 0 :(得分:2)

绘制'哈希标记'将是真正的问题。 TreeView具有DrawMode属性,但其DrawItem事件不允许您在节点之间绘制。

您需要通过更改光标来指示将要发生的事情。使用GiveFeedback事件,将e.UseCustomCursors设置为false,并将Cursor.Current分配给指示操作的自定义光标。

答案 1 :(得分:1)

This article表达了同样的问题,并提供了一种类似于您已经遵循的方法(除了阈值基本上是树节点高度的百分比)。基于此,以及当我以前这样做的时候,这是我能找到的最好的方法,我认为你基本上正常。