Csharp/C#教程:为什么我不能在程序的两个实例之间拖动一个Point?分享


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

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

指定的记录无法映射到托管值类。

为什么?

编辑:这是代码:

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

和:

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

无法映射指定的记录

注意“记录”这个词的奇怪之处。 它是“结构”的以COM为中心的词。 你想要做的几乎可以工作,但并不完全。 DoDragDrop()方法正确地将Point结构封送到COM对象,因为Point具有[ComVisible(true)]属性。 缺少的成分是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的条目。 KABOOM。

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

这看起来像一个黑客,但你可以这样做,我测试它的工作原理。 编辑猜猜它没有回答为什么? 题。

上述就是C#学习教程:为什么我不能在程序的两个实例之间拖动一个Point?分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!

 private void panel1_MouseDown(object sender, MouseEventArgs e) { Point MyPoint = new Point(100, 200); DoDragDrop(new string[] { MyPoint.X.ToString(), MyPoint.Y.ToString() }, DragDropEffects.Copy); } private void Form1_DragEnter(object sender, DragEventArgs e) { e.Effect = DragDropEffects.Copy; } private void Form1_DragDrop(object sender, DragEventArgs e) { if (e.Data.GetDataPresent(typeof(string[]))) { string[] item = (string[])e.Data.GetData(typeof(string[])); Point e2 = new Point(Int32.Parse(item[0]), Int32.Parse(item[1])); MessageBox.Show(e2.X+":"+e2.Y); } } 

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/cdevelopment/985680.html

(0)
上一篇 2021年12月21日
下一篇 2021年12月21日

精彩推荐