如何在拖动时突出显示目标节点

ike*_*kel 2 c# winforms

我有一个树视图并尝试将节点移动到父节点(拖放),

是否有任何方法允许目标节点在鼠标悬停时显示背景颜色(左按钮仍然保持拖动项目)?

[更新]以下代码怎么不工作?

    private TreeNode nodeOver=null;
    private void treeView_DragOver(object sender, DragEventArgs e)
    {
       Point p = treeView.PointToClient(new Point(e.X, e.Y));
       nodeOver = treeView.GetNodeAt(p.X, p.Y);
        nodeOver.BackColor = Color.Aquamarine;
    }
    private void treeView_DragLeave(object sender, EventArgs e)
    {
        nodeOver.BackColor = Color.White;
    }
Run Code Online (Sandbox Code Playgroud)

Vel*_*uis 5

您可以尝试如下操作:

    private void treeView_DragOver(object sender, DragEventArgs e)
    {
        ClearBackground(treeView.Nodes);
        Point p = treeView.PointToClient(new Point(e.X, e.Y));
        TreeNode node = treeView.GetNodeAt(p.X, p.Y);
        node.BackColor = Color.Aquamarine;
    }

    private void ClearBackground(TreeNodeCollection nodes)
    {
        foreach (TreeNode node in nodes)
        {
            node.BackColor = Color.White;
            ClearBackground(node.Nodes);
        }
    }
Run Code Online (Sandbox Code Playgroud)

编辑

这是一个不会引起闪烁的改进版本:

    private void treeView_DragOver(object sender, DragEventArgs e)
    {
        Point p = treeView.PointToClient(new Point(e.X, e.Y));
        TreeNode node = treeView.GetNodeAt(p.X, p.Y);
        if (node.PrevVisibleNode != null)
        {
            node.PrevVisibleNode.BackColor = Color.White;
        }
        if (node.NextVisibleNode != null)
        {
            node.NextVisibleNode.BackColor = Color.White;
        }
        node.BackColor = Color.Aquamarine;
    }
Run Code Online (Sandbox Code Playgroud)


小智 5

Veldmius,你上面的回答是不可靠的,有点冗长.如果没有可用的上一个或下一个节点,则NextVisibleNode和PreviousVisibleNode将抛出空异常.

我这样做的方式如下...转到设计器中树视图的属性.设置HideSelection = False

然后用这两行代码连接dragover事件.

private void treeview1_DragOver(object sender, DragEventArgs e)
    {
        TreeNode node = treeview1.GetNodeAt(treeview1.PointToClient(new Point(e.X, e.Y)));
        treeview1.SelectedNode = node;
    }
Run Code Online (Sandbox Code Playgroud)