C# DragEnter和DragDrop事件未在treeview中触发

C# DragEnter和DragDrop事件未在treeview中触发,c#,events,drag-and-drop,treeview,dragenter,C#,Events,Drag And Drop,Treeview,Dragenter,我需要使用c语言中的treeview进行拖放操作。为此,我听说3个事件是最常见的 1.1.1.2.2.2 2.DragDrop和3.DragEnter 而此处itemDrag事件是在从树视图拖动时为我触发的,但其余两个事件都不是为我触发的。尝试了许多解决方案,现在来到此处寻求解决方案 private void treeView1_ItemDrag(object sender, ItemDragEventArgs e) { string[] strItem = e.I

我需要使用c语言中的treeview进行拖放操作。为此,我听说3个事件是最常见的 1.1.1.2.2.2 2.DragDrop和3.DragEnter

而此处itemDrag事件是在从树视图拖动时为我触发的,但其余两个事件都不是为我触发的。尝试了许多解决方案,现在来到此处寻求解决方案

    private void treeView1_ItemDrag(object sender, ItemDragEventArgs e)
    {
       string[] strItem = e.Item.ToString().Split(':');
       DoDragDrop(strItem[1], DragDropEffects.Copy | DragDropEffects.Move); }
上述方法

    private void treeView1_DragEnter(object sender, DragEventArgs e)
    {
        e.Effect = DragDropEffects.Move;
    }
上面的dragEnter事件没有发射,同样的dragDrop事件也没有发射。为什么会这样

我正在从树视图中拖动,需要粘贴到PowerPoint或Word中。ie treeview有点像办公工具的插件

问候,, 阿沙德

允许降落和

好的,假设您的所有事件都以加载的形式声明/创建。。。e、 一,。 :

拖动事件用于在树状视图中触发拖动事件,这就是它工作的原因。当您输入另一个*控件的边界时,拖动程序将启动

i、 e您想从treeview 1拖动到treeview 2

如果您没有尝试将项目拖动到其他控件中,则dragEnter是错误的

以下是拖放事件示例:

 private void tlAssemblies_DragDrop(object sender, DragEventArgs e)
 {
    if (sender == null)
        return;
    Point p = tlAssemblies.PointToClient(new Point(e.X, e.Y));
    TreeListNode dragNode = e.Data.GetData(typeof(TreeListNode)) as TreeListNode;
    TreeListNode targetNode = tlAssemblies.CalcHitInfo(p).Node;
    if (targetNode == null)
    {
        return;
    }
} 不确定是否可能,但您可能希望更改现有的dragEnter代码,并在拖动事件中使用它,即

  e.Effect = DragDropEffects.Move; 
如果您没有离开正在来回拖动的同一控件,则最好显示拖动运动

你可以做的另一件事是在treeView_MouseMove活动上

 private void tlAssemblies_MouseMove(object sender, MouseEventArgs e)
    {
        if (e.Button == MouseButtons.Left && downHitInfo != null)
        {
            Size dragSize = SystemInformation.DragSize;
            Rectangle dragRect = new Rectangle(new Point(downHitInfo.HitPoint.X -     dragSize.Width / 2,
            downHitInfo.HitPoint.Y - dragSize.Height / 2), dragSize);
            if (!dragRect.Contains(new Point(e.X, e.Y)))
            {
                DataRow row = viewProduct.GetDataRow(downHitInfo.RowHandle);
                if(row != null)
                tlAssemblies.DoDragDrop(row, DragDropEffects.Move); 
                //viewProduct.GridControl.DoDragDrop(row, DragDropEffects.All); 
                downHitInfo = null;
                DevExpress.Utils.DXMouseEventArgs.GetMouseArgs(e).Handled = true;
            }
        }
    }

从您提供的代码中,我看不到您已经实现了DragDrop事件,也没有在所涉及的控件上设置AllowDrop属性,这是执行拖放操作所需的两个其他事件

下面是直接从中获取的示例,它使用两个TreeView在两者之间移动节点。添加两个TreeView,添加一些根节点和子节点,并连接这些事件。记住AllowDrop属性

我已经添加了几个Debug.WriteLine来帮助测试时进行调试。很难使用断点-

注意:对于brewity,我没有提供事件连接代码,也没有提供创建示例节点的代码。如果需要,可以在参考文章中找到。否则,请使用属性窗口添加这些属性

示例代码:


您正在开发什么类型的应用程序?Web/WinForms/…?您为给定控件设置了AllowDrop属性吗?@scheien:没有。??是否应该??您必须在dragdrop中涉及的所有控件上设置AllowDrop属性。e、 g.treeview1和treeview2,或者如果您仅重新定位元素,则仅使用treeview1。只是为了澄清:拖动项移动到的控件的拖动程序应触发。如果您从树状视图中拖出一个项目,然后带着它返回,事件将触发。但是,您需要将AllowDrop设置为true。@安东尼:我正在从树视图中拖动,需要粘贴到PowerPoint或Word中。ie treeview有点像一个插件。
 private void tlAssemblies_MouseMove(object sender, MouseEventArgs e)
    {
        if (e.Button == MouseButtons.Left && downHitInfo != null)
        {
            Size dragSize = SystemInformation.DragSize;
            Rectangle dragRect = new Rectangle(new Point(downHitInfo.HitPoint.X -     dragSize.Width / 2,
            downHitInfo.HitPoint.Y - dragSize.Height / 2), dragSize);
            if (!dragRect.Contains(new Point(e.X, e.Y)))
            {
                DataRow row = viewProduct.GetDataRow(downHitInfo.RowHandle);
                if(row != null)
                tlAssemblies.DoDragDrop(row, DragDropEffects.Move); 
                //viewProduct.GridControl.DoDragDrop(row, DragDropEffects.All); 
                downHitInfo = null;
                DevExpress.Utils.DXMouseEventArgs.GetMouseArgs(e).Handled = true;
            }
        }
    }
private void treeView_ItemDrag(object sender, ItemDragEventArgs e)
{
    Debug.WriteLine("ItemDrag fired!");
    DoDragDrop(e.Item, DragDropEffects.Move);
}

private void treeView_DragEnter(object sender, DragEventArgs e)
{
    Debug.WriteLine("TreeView DragEnter fired!");
    e.Effect = DragDropEffects.Move;
}

private void treeView_DragDrop(object sender, DragEventArgs e)
{
    Debug.WriteLine("TreeView DragDrop fired!");
    TreeNode NewNode;
    if (e.Data.GetDataPresent("System.Windows.Forms.TreeNode", false))
    {
        Point pt = ((TreeView)sender).PointToClient(new Point(e.X, e.Y));
        TreeNode DestinationNode = ((TreeView)sender).GetNodeAt(pt);
        NewNode = (TreeNode)e.Data.GetData("System.Windows.Forms.TreeNode");
        if (DestinationNode.TreeView != NewNode.TreeView)
        {
            DestinationNode.Nodes.Add((TreeNode)NewNode.Clone());
            DestinationNode.Expand();
            //Remove Original Node
            NewNode.Remove();
        }
    }
}