300分求解决drag and drop的问题,分不够还可能加

yzxandfcm 2007-07-11 04:41:25
怎样实现两个程序间的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;
}
...全文
230 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
yzxandfcm 2007-07-15
  • 打赏
  • 举报
回复
问题解决了,谢谢各位,结帐了哈~!
wzc999_ 2007-07-13
  • 打赏
  • 举报
回复
很多成员是多少啊?序列化也不受个数限制啊
我在这里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里得了。
楼主把你的代码发给我试试吧
每一个都要回吗?晕
yzxandfcm 2007-07-13
  • 打赏
  • 举报
回复
wzc999_(一流冷涧) :
我要序列化的是一个自定义的对象,对象中包括很多成员,不仅仅是通过 new TreeView来完成的,所以我的序列化要复杂的多!是要把对象中的所以成员序列化了!
vainnetwork 2007-07-12
  • 打赏
  • 举报
回复
帮楼住顶人气了
GXY2005 2007-07-12
  • 打赏
  • 举报
回复
要用findwindow,sendmessage等api吧,要么找个中转存储的办法,比如先写到文本再读出来。
yzxandfcm 2007-07-12
  • 打赏
  • 举报
回复
先试试,谢谢大家
wzc999_ 2007-07-12
  • 打赏
  • 举报
回复
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序列化,不过节贴板挺方便的啊,头一次用呢。这个是简单实现,很多细节都省了
yuan731 2007-07-12
  • 打赏
  • 举报
回复
jf而来
lovefootball 2007-07-12
  • 打赏
  • 举报
回复
clipBoardData 这个类必须可以序列化
也就是必须
[Serializable]
lovefootball 2007-07-12
  • 打赏
  • 举报
回复
剪贴板的操作有问题
可以看看这个例子
http://www.codeproject.com/csharp/clipboard01.asp
yzxandfcm 2007-07-12
  • 打赏
  • 举报
回复
用剪贴板问题来了,好像剪贴板的容量是有限的,我每次去取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());
wangwei155 2007-07-11
  • 打赏
  • 举报
回复
不错
vainnetwork 2007-07-11
  • 打赏
  • 举报
回复
顶了再说
symbol441 2007-07-11
  • 打赏
  • 举报
回复
学习,帮顶
yzxandfcm 2007-07-11
  • 打赏
  • 举报
回复
OK,Thanks,我先试试!
lovefootball 2007-07-11
  • 打赏
  • 举报
回复
把拖拽的东西放到剪贴板里就可以了
拖拽的时候Copy进去
然后DragDrop的时候读出来
别忘了类型
:)

http://www.jaron.cn/chs_scripts/10/2005-03/20050311234323-101646.html
yzxandfcm 2007-07-11
  • 打赏
  • 举报
回复
是winform!
回antarp() :
我是只有一个三角,但我发了三个贴子出来,很个贴子都是100分,合起来就是300分了,那位解决了,分可以再加!
qery 2007-07-11
  • 打赏
  • 举报
回复
xuan.ye 2007-07-11
  • 打赏
  • 举报
回复
winfom么?
vacansy 2007-07-11
  • 打赏
  • 举报
回复
帮你up
加载更多回复(3)

110,499

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧