怎样实现两个程序间的drag and drop, 如我写了一个程序里面有一个Tree,我运行它两次,取A&B两个进程,我想从A程序的Treeview 拖拽到B程序中的Treeview中,我用下面的代码只能在A进程(或B进程)内的TreeView内拖拽,希望高手指点迷津。            void trvLeftview_ItemDrag(object sender, ItemDragEventArgs e)
            {
                if (e.Button == MouseButtons.Right) return;  //判断是否是鼠标右键按动                this.trvLeftview.DoDragDrop(e.Item, DragDropEffects.Move);
            }            void trvLeftview_DragEnter(object sender, DragEventArgs e)
            {                    e.Effect = DragDropEffects.Move;
            }            void trvLeftview_DragDrop(object sender, DragEventArgs e)
            {
                TreeNode dragNode = (TreeNode)(e.Data.GetData(typeof(TreeNode)));                System.Drawing.Point Position = new Point();
                Position.X = e.X;
                Position.Y = e.Y;
                Position = ((TreeView)sender).PointToClient(Position);
                TreeNode targetNode = ((TreeView)sender).GetNodeAt(Position);                if (dragNode == null || targetNode == null) 
                    return;
            }

解决方案 »

  1.   

    是winform!
    回antarp() :
    我是只有一个三角,但我发了三个贴子出来,很个贴子都是100分,合起来就是300分了,那位解决了,分可以再加!
      

  2.   

    把拖拽的东西放到剪贴板里就可以了
    拖拽的时候Copy进去
    然后DragDrop的时候读出来
    别忘了类型
    :)http://www.jaron.cn/chs_scripts/10/2005-03/20050311234323-101646.html
      

  3.   

    用剪贴板问题来了,好像剪贴板的容量是有限的,我每次去取getData 都是空,private struct clipBoardData
    {
        public AbstractCPSTreeNode clipTreeNode;
        public AbstractCPSTreeNode clipParentNode;
    }clipBoardData clipboard;
    clipboard.clipTreeNode = currTreeViewNode;
    clipboard.clipTreeNode = currTreeViewNode.Parent;
    Clipboard.SetData(typeof(clipBoardData).ToString(), (object)clipboard);  object getData = Clipboard.GetDataObject().GetData(typeof(clipBoardData).ToString());
      

  4.   

    剪贴板的操作有问题
    可以看看这个例子
    http://www.codeproject.com/csharp/clipboard01.asp
      

  5.   

    clipBoardData 这个类必须可以序列化
    也就是必须
    [Serializable]
      

  6.   

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;
    using System.Collections;
    using System.Text.RegularExpressions;namespace WebSnatch
    {
        public partial class Form3 : Form
        {
            public Form3()
            {
                InitializeComponent();
            }        
            private void treeView1_ItemDrag(object sender, ItemDragEventArgs e)
            {
                if (e.Button == MouseButtons.Left)
                {
                    treeView1.DoDragDrop(e.Item, DragDropEffects.Move);//可去掉了
                    Clipboard.SetDataObject(new TestClass((e.Item as TreeNode).Text));
                }
            }        private void treeView1_DragEnter(object sender, DragEventArgs e)
            {
                if (e.Data.GetDataPresent(typeof(TreeNode)))
                {
                e.Effect = DragDropEffects.Move;
                }
            }        private void treeView1_DragDrop(object sender, DragEventArgs e)
            {
                TreeNode dragNode = (TreeNode)(e.Data.GetData(typeof(TreeNode)));            System.Drawing.Point Position = new Point();
                Position.X = e.X;
                Position.Y = e.Y;
                Position = ((TreeView)sender).PointToClient(Position);
                TreeNode targetNode = ((TreeView)sender).GetNodeAt(Position);            if (dragNode == null)
                    return;            // 1.目标节点不是空。2.目标节点不是被拖拽接点的字节点。3.目标节点不是被拖拽节点本身
                if (targetNode != null && targetNode.Parent != dragNode && targetNode != dragNode)
                {
                    TreeNode D = dragNode;
                    // 将被拖拽节点从原来位置删除。
                    dragNode.Remove();
                    // 在目标节点下增加被拖拽节点
                    targetNode.Nodes.Add(D);
                }
                // 如果目标节点不存在,即拖拽的位置不存在节点,那么就将被拖拽节点放在根节点之下
                if (targetNode == null)
                {
                    TreeNode D = dragNode;
                    dragNode.Remove();
                    treeView1.Nodes.Add(D);
                }
            }        private void treeView2_ItemDrag(object sender, ItemDragEventArgs e)
            {        }        private void treeView2_DragEnter(object sender, DragEventArgs e)
            {
                if (e.Data.GetDataPresent(typeof(TreeNode)))
                {
                    e.Effect = DragDropEffects.Move;
                }
            }        private void treeView2_DragDrop(object sender, DragEventArgs e)
            {
                TreeNode dragNode = new TreeNode();
                //TreeNode dragNode = (TreeNode)(e.Data.GetData(typeof(TreeNode)));
                IDataObject iData = Clipboard.GetDataObject();
                if (iData.GetDataPresent(typeof(TestClass)))
                {
                    TestClass t ;
                    t = iData.GetData(typeof(TestClass)) as TestClass;
                    dragNode = new TreeNode(t.S);
                }
                System.Drawing.Point Position = new Point();
                Position.X = e.X;
                Position.Y = e.Y;
                Position = ((TreeView)sender).PointToClient(Position);
                TreeNode targetNode = ((TreeView)sender).GetNodeAt(Position);            if (dragNode == null)
                    return;            // 1.目标节点不是空。2.目标节点不是被拖拽接点的字节点。3.目标节点不是被拖拽节点本身
                if (targetNode != null && targetNode.Parent != dragNode && targetNode != dragNode)
                {
                    TreeNode D = dragNode;
                    //// 将被拖拽节点从原来位置删除。
                    //dragNode.Remove();
                    // 在目标节点下增加被拖拽节点
                    targetNode.Nodes.Add(D);
                }
                // 如果目标节点不存在,即拖拽的位置不存在节点,那么就将被拖拽节点放在根节点之下
                if (targetNode == null)
                {
                    TreeNode D = dragNode;
                    //dragNode.Remove();
                    treeView1.Nodes.Add(D);
                }
            }
        }    [Serializable]
        public class TestClass
        {
            public TestClass(string s)
            {
                this._s = s;
            }
            private string _s;        public string S
            {
                get { return _s; }
                set { _s = value; }
            }
        }
    把上面大家的思路总结一下,试了一下,还好使呵呵。如果节点传递多少信息都可以通过TestClass传给剪贴板,其实就是序列化了,你也可以自己使用xml序列化,不过节贴板挺方便的啊,头一次用呢。这个是简单实现,很多细节都省了
      

  7.   

    要用findwindow,sendmessage等api吧,要么找个中转存储的办法,比如先写到文本再读出来。
      

  8.   

    wzc999_(一流冷涧) :
    我要序列化的是一个自定义的对象,对象中包括很多成员,不仅仅是通过 new TreeView来完成的,所以我的序列化要复杂的多!是要把对象中的所以成员序列化了!
      

  9.   

    很多成员是多少啊?序列化也不受个数限制啊
    我在这里Clipboard.SetDataObject(new TestClass((e.Item as TreeNode).Text));只是演示了一个字段,如果多个的话可以new 一个比较复杂的TestClass实现那
    然后再
                if (iData.GetDataPresent(typeof(TestClass)))
                {
                    TestClass t ;
                    t = iData.GetData(typeof(TestClass)) as TestClass;
                    dragNode = new TreeNode(t.S);
                }这里把信息再给新节点就可以了
    只演示一个字段因为你再多的信息也不是所有的都用来显示啊,不行就放到Tag里得了。
    楼主把你的代码发给我试试吧
    每一个都要回吗?晕