winforms 如何在树视图之间进行拖放操作?[已关闭]

hts6caw3  于 2022-12-23  发布在  其他
关注(0)|答案(1)|浏览(156)

已关闭。此问题需要超过focused。当前不接受答案。
**想要改进此问题吗?**更新此问题,使其仅关注editing this post的一个问题。

3天前关闭。
Improve this question
我想做的是做一个类似于文件指挥官的应用程序,它有两个显示文件夹结构的树视图。我被困在如何将节点从一端移动到另一端,所以我的问题是非常基本的(如标题所述)。
一旦我可以做到这一点,我将不得不弄清楚如何复制文件/目录的基础上,这个操作。

bttbmeg0

bttbmeg01#

您的问题是如何在TreeView之间进行拖放?
我以为找到一个微软的示例会很容易,但我的快速搜索只找到了“一棵树”的版本。没关系,没有太多的东西。这里有一些基本的东西,非常类似于这个MS示例树视图。项目拖动,但适用于两棵树。

public MainForm()
    {
        InitializeComponent();
        treeViewA.AllowDrop = true;
        treeViewA.ItemDrag += onAnyItemDrag;
        treeViewA.DragDrop += onAnyDragDrop;
        treeViewA.DragOver += onAnyDragOver;

        treeViewB.AllowDrop = true;
        treeViewB.ItemDrag += onAnyItemDrag;
        treeViewB.DragDrop += onAnyDragDrop;
        treeViewB.DragOver += onAnyDragOver;
    }

    private void onAnyItemDrag(object? sender, ItemDragEventArgs e)
    {
        if(sender is TreeView treeView)
        {
            treeView.DoDragDrop(e.Item, DragDropEffects.Move);
        }
    }

    private void onAnyDragOver(object? sender, DragEventArgs e)
    {
        if (sender is TreeView treeView)
        {
            TreeNode
                dragNode = (TreeNode)e.Data.GetData(typeof(TreeNode)),
                dropNode = treeView.GetNodeAt(treeView.PointToClient(new Point(e.X, e.Y)));
            if(ReferenceEquals(dragNode, dropNode)) 
            {
                e.Effect = 0;
                // To Do
                // Can't drop on descendant node either.
            }
            else
            {
                e.Effect = e.AllowedEffect;
            }
        }
    }

    private void onAnyDragDrop(object? sender, DragEventArgs e)
    {
        if (sender is TreeView treeView)
        {
            TreeNode
                dragNode = (TreeNode)e.Data.GetData(typeof(TreeNode)),
                dropNode = treeView.GetNodeAt(treeView.PointToClient(new Point(e.X, e.Y)));
            // Remove from where it is now
            dragNode.Remove();
            if(dropNode == null)
            {
                treeView.Nodes.Add(dragNode);
            }
            else
            {
                dropNode.Nodes.Add(dragNode);
            }
            dragNode.Parent?.Expand();
        }
    }
}

Clone

相关问题