1

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

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

我试图弄清楚如何通过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 属性的形式。

4

2 回答 2

1

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

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

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 上。

于 2012-05-01T21:22:36.087 回答
0

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

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

简单地说:拖放不是一种拖动控件的方法。无论如何,您需要很多自定义逻辑。这不像 dnd 的内置功能在这里可以帮助您。

于 2012-05-01T21:19:58.417 回答