拖放自定义对象

时间:2011-07-01 11:07:24

标签: c# winforms drag-and-drop

我有两个控件一个表单:列表和树(特定类型名称无关)。

在列表控件中,我执行DoDragDrop方法。作为第一个参数,我传递一个对象,该对象是绑定到该行的数据。该对象实现了一个特定的接口,并标有Seri​​alizable属性。

我想要的是在树控件的DragEnter / DragDrop事件处理程序中检索该对象。我正在使用以下代码:

void TreeControlDragEnter(object sender, DragEventArgs e)
{
    var formats = e.Data.GetFormats();
    var data = e.Data.GetData(typeof (IFoo));
}

不幸的是,结果数据为null,格式是一个单元素数组,它保存特定类型的名称(实现IFoo)。我假设我必须将确切的类型名称传递给GetData来撤销对象,但它不可能,因为它是一个私有类。

有没有办法通过界面获取对象?

1 个答案:

答案 0 :(得分:3)

您必须提供与首先序列化的类相同的类型。您不能使用序列化类的接口或基类,因为不止一种格式可能匹配它,并且它不知道要反序列化哪一种。如果你有几个类都实现IFoo并且数据对象中有每个实例,那么要求IFoo将是不明确的。因此,您必须询问序列化到数据对象中的确切类型。

这意味着您不应该将类放入无法反序列化的数据对象中,因为它们在另一端是私有的。