c# - 为什么我不能在程序的两个实例之间拖动一个点?

标签 c# winforms drag-and-drop

我有一个 DoDragDrop,我在其中将数据设置为 Point。当我在一个实例中拖动时 – 一切正常。但是当我在程序的两个实例之间拖动时,Visual Studio 给我这个错误:

The specified record cannot be mapped to a managed value class.

为什么?

编辑:这是代码:

DataObject d = new DataObject();
d.SetData("ThePoint", MyPoint);
DragDropEffects e = DoDragDrop(d, DragDropEffects.Move);

和:

Point e2 = (Point)e.Data.GetData("ThePoint");

最佳答案

The specified record cannot be mapped

请注意“记录”这个词的奇怪之处。它是一个以 COM 为中心的词,表示“struct”。您尝试做的事情几乎 有效,但不完全有效。 DoDragDrop() 方法正确地将 Point 结构编码为 COM 对象,这可能是因为 Point 具有 [ComVisible(true)] 属性。缺少的成分是 IRecordInfo 所需的信息,IRecordInfo 是一个描述结构布局的 COM 接口(interface)。必需的,因为结构具有非常依赖于编译器的布局。

该接口(interface)通常通过从类型库中读取结构定义来实现。实际上可用,Point 结构在 c:\windows\microsoft.net\framework\v2.0.50727\system.drawing.tlb 中有描述。您可以使用 OleView.exe 工具、File + View Typelib 查看它。

一切都很好,除了 COM 对象的接收者必须将其转换回托管对象(Point)的部分。这需要找出包含对象定义的类型库,以便 IRecordInfo 可以完成它的工作。其中记录在注册表中的HKCR\Record键。其中包含 Point 的条目。轰隆隆。

创建你自己的类(不是结构)来存储数据,给它 [Serializable] 属性,这样它就可以被简单地编码。

关于c# - 为什么我不能在程序的两个实例之间拖动一个点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10979900/

相关文章:

c# - 你如何在工厂中实现构造函数注入(inject)?

c# - AssemblyInfo.cs 中的 C# 程序中的 GUID 是什么?

c# - CommandParameter 始终为空 wpf MVVM

c# - ArgumentOutOfRange 异常 C#

c# - 如何在不打开浏览器的情况下运行 url 并再次保存加载的文件?

drag-and-drop - Mojave - 如果写入的项目多于拖动的行,则从 NSTableView 拖放会失败

java - 将文件路径拖放到 Java Swing JTextField

c# - 将新列添加到 GridView DevExpress

c# - Winforms——多选下拉列表

javascript - react /Dnd : Make a component draggable and droppable at the same time