如何通过 DragDrop 事件传递数据

本文关键字:数据 事件 何通过 DragDrop | 更新日期: 2023-09-27 18:33:02

我自己做活动的经验很少。我目前正在使用窗体和控件来处理事件,因此我尝试坚持使用 WinForm 处理事件的方式。

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

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

特别是当涉及到

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

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

这种数据格式在做什么?它只是显示所涉及的数据类型吗?我见过测试数据格式的示例,并根据数据格式发生了各种操作。你不能只做一个类型(你的数据(来检查类型吗?我不明白数据格式有什么用。

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 属性的形式。

如何通过 DragDrop 事件传递数据

这里有一些东西可以让你了解它是如何完成的。

首先将两个面板放在窗体上,并将它们的颜色设置为两种不同的颜色。

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

然后将面板 1 拖到面板 2 上。

我认为

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

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

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