isp*_*iro 5 c# drag-and-drop winforms
我有一个DoDragDrop,我将数据设置为Point.当我在一个实例中拖动时 - 一切都没问题.但是当我在程序的两个实例之间拖动时,Visual Studio会给我这个错误:
指定的记录无法映射到托管值类.
为什么?
编辑:这是代码:
DataObject d = new DataObject();
d.SetData("ThePoint", MyPoint);
DragDropEffects e = DoDragDrop(d, DragDropEffects.Move);
Run Code Online (Sandbox Code Playgroud)
和:
Point e2 = (Point)e.Data.GetData("ThePoint");
Run Code Online (Sandbox Code Playgroud)
无法映射指定记录
请注意“记录”这个词的奇怪之处。它是一个以 COM 为中心的词,表示“结构”。您尝试做的事情几乎有效,但不完全有效。DoDragDrop() 方法正确地将 Point 结构编组为 COM 对象,这可能是因为 Point 具有 [ComVisible(true)] 属性。缺少的成分是 IRecordInfo 所需的信息,IRecordInfo 是一个描述结构布局的 COM 接口。必需的,因为结构具有非常依赖于编译器的布局。
该接口通常通过从类型库读取结构定义来实现。事实上,Point 结构是可用的,在 c:\windows\microsoft.net\framework\v2.0.50727\system.drawing.tlb 中描述。您可以使用 OleView.exe 工具 File + View Typelib 查看它。
一切都很好,除了 COM 对象的接收者必须将其转换回托管对象(Point)的部分。这需要找出哪个类型库包含对象定义,以便 IRecordInfo 可以完成其工作。其记录在注册表HKCR\Record键中。其中不包含Point 的条目。轰隆隆。
创建您自己的类(而不是结构)来存储数据,为其赋予 [Serializable] 属性,以便可以轻松地对其进行封送。