如何通过DragDrop事件传递数据?

时间:2012-05-01 18:54:19

标签: c# .net winforms events

我在制作自己的活动方面经验很少。我目前正在使用表单和控件来处理事件,所以我试图坚持使用WinForm处理事件的方式。

WinForm控件已经拥有自己的事件。由于事件是使用某种委托类型进行的,因此我必须在我用来处理事件期间发生的事情的方法中匹配委托签名。据我所知,这意味着我必须在我的事件处理程序中接受两个参数:来源ObjectEventArgs

我正试图弄清楚如何通过DragDrop相关事件在控件之间传递各种信息。我已经能够在不同的情况下在线找到各种代码片段,但我希望能更好地理解信息的实际传递方式。

特别是DragDrop个事件,似乎我的信息将通过DataObject传递。反过来,它作为参数传递给DragDrop.DoDragDrop方法。

这是我的理解开始减少的地方。在我看过的大多数示例中,看起来都指定了某种数据格式。数据格式本身是字符串类型。通常,数据格式与数据一起传递到DataObject

这种数据格式在做什么?它只是显示所涉及的数据类型吗?我已经看过测试数据格式的示例,并根据数据格式进行了各种操作。难道你不能只做一个typeof(YourData)来检查类型吗?我不明白数据格式是如何有用的。

http://msdn.microsoft.com/en-us/library/ms741842.aspx

在上面的链接中,第一个示例显示正在创建的DataObject未指定数据格式。它解释了自动选择数据格式并默认转换对象。

您可以将任何对象传递到DataObject吗?然后当DragDrop事件发生在目标控件上时,该控件是否可以访问传递的对象的方法和字段?或者DataObject会将对象转换为其他形式吗?各种结构怎么样?

我还做了一些从Windows资源管理器图标拖放到我的表单。我能够通过我找到的一些示例代码获取图标的文件路径。它还使用了数据格式。

if (e.Data.GetDataPresent(DataFormats.FileDrop))
{
    e.Effect = DragDropEffects.Copy;
}

内容: 我试图了解数据如何通过WinForm事件传递。我不理解我在各种DragDrop示例中看到的一些内容。我知道数据以某种方式以各种格式存储,并且有一种方法可以提取该数据。我不明白数据格式的用途。我不清楚究竟什么类型的数据可以通过DataObject传输。我对EventArgs的理解一般都很缺乏。

随意评论我在这里提到的任何事情。如果我说错了,请指出。任何有助于我更好地理解这一主题的内容都值得赞赏。

修改 我决定解释一下我打算去哪里。也许有人可以使用我正在尝试做的事情来解释我所问的一些事情。

我有一个包含某种控件的表单。我正在尝试使控件的位置高度可定制和动态。每当用户向表单添加另一个控件时,每个控件都会自动重新定位,以保持整齐有序。

我目前正在尝试允许用户在窗体周围拖动控件以重新定位它。无论用户决定放弃控件,所有其他控件都会移开,以便为移动控件腾出空间。

如果我能够正确地移动拖动的控件和窗体上的所有其他控件,我需要能够从拖动的控件中获取某些信息。需要通过事件传递的主要数据采用使用System.Drawing.Point结构的Location属性的形式。

2 个答案:

答案 0 :(得分:1)

这里有一些东西让你知道它是如何完成的。

首先在Form上放下两个面板,然后将它们的颜色设置为两种不同的颜色。

public Form1()
{
    InitializeComponent();

    panel1.MouseDown += new MouseEventHandler(panel1_MouseDown);
    panel2.AllowDrop = true;
    panel2.DragEnter += new DragEventHandler(panel2_DragEnter);
    panel2.DragDrop += new DragEventHandler(panel2_DragDrop);
}

void panel1_MouseDown(object sender, MouseEventArgs e)
{
    panel1.DoDragDrop(panel1, DragDropEffects.Move);
}

void panel2_DragEnter(object sender, DragEventArgs e)
{
    if (e.Data.GetData(typeof(Panel)) != null) e.Effect = DragDropEffects.Move;
}

void panel2_DragDrop(object sender, DragEventArgs e)
{
    Panel p = sender as Panel;//Not needed in this case. Could just write panel2.
    Panel dropped = (Panel)e.Data.GetData(typeof(Panel));
    dropped.Location = p.PointToClient(new Point(e.X, e.Y));
    p.Controls.Add(dropped);
}

然后将panel1拖到panel2上。

答案 1 :(得分:0)

我认为这个问题不应该使用拖放来解决。拖放是指多个应用程序交换数据的一种方式。如果您拖动的数据仅对当前流程有意义,请不要使用拖放。

您可以使用字段(例如,包含表单实例上的字段)来存储您需要的所有数据。

只是说显而易见:拖放不是一种拖动控件的方法。无论如何,你需要很多自定义逻辑。这并不像dnd的内置功能会对你有帮助。