【问题标题】:DragEnter and DragDrop events not FIRING in treeview在树视图中未触发 DragEnter 和 DragDrop 事件
【发布时间】:2014-07-11 05:12:30
【问题描述】:

我需要在 c# 中使用 treeview 进行拖放。我听说 3 个事件是最常见的 1.项目拖动 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 中。 (即)树视图类似于 Office 工具的插件。

问候, 阿尔沙德

【问题讨论】:

  • 您正在开发什么类型的应用程序?网页/WinForms/...?
  • 您是否为给定控件设置了AllowDrop 属性?
  • @scheien:不,我没有。??我应该吗??
  • 您必须在拖放中涉及的所有控件上设置 AllowDrop 属性。例如treeview1 和 treeview2,或者如果您只重新定位元素,则只需 treeview1。
  • 只是为了澄清: DragEnter 应该为拖动项目移动到的控件触发。如果您将一个项目拖出树视图,然后将其返回,则该事件将触发。但是,您需要将 AllowDrop 设置为 true。

标签: c# events drag-and-drop treeview dragenter


【解决方案1】:

允许删除 AND..

好的,假设您在 Form_Load 中声明/创建了所有事件... e.i. :

tlAssemblies.DragDrop +=tlAssemblies_DragDrop;
tlAssemblies.MouseDown +=tlAssemblies_MouseDown;
tlAssemblies.MouseMove +=tlAssemblies_MouseMove;
tlAssemblies.DragEnter +=tlAssemblies_DragEnter;
tlAssemblies.DragOver += tlAssemblies_DragOver;

拖动事件适用于当您在 treeView 中触发拖动事件时,这就是它起作用的原因。 dragEnter 是当您输入不同*控件的边界时。

即您想从树视图 1 拖到树视图 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;
            }
        }
    }

【讨论】:

  • @antony :正在从树形视图中拖动,需要粘贴到 PowerPoint 或 Word 中。 (ie) treeview 类似于 AddIn。
【解决方案2】:

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

这里是直接从MSDN 抓取的示例,它使用两个树视图在其间移动节点。添加几个树视图,添加一些根节点和子节点,然后连接这些事件。记住AllowDrop 属性。

我添加了几个Debug.WriteLine() 来帮助在测试时进行调试。断点可能很难做到;-)

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

示例代码:

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();
        }
    }
}

【讨论】:

    猜你喜欢
    • 2011-02-07
    • 2023-03-16
    • 1970-01-01
    • 1970-01-01
    • 2010-10-08
    • 2023-04-01
    • 1970-01-01
    • 2013-02-15
    • 1970-01-01
    相关资源
    最近更新 更多