5

Point1 つのインスタンス内でドラッグすると、データを .when に設定する DoDragDrop があります。すべて問題ありません。しかし、プログラムの 2 つのインスタンス間でドラッグすると、Visual Studio で次のエラーが表示されます。

指定されたレコードは管理値クラスにマップできません。

なんで?

編集:ここにコードがあります:

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

と:

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

2 に答える 2

4

指定されたレコードをマップできません

「記録」という言葉の奇妙さに注意してください。「構造体」を表す COM 中心の言葉です。あなたがやろうとしていることはほとんどうまくいきますが、完全ではありません。DoDragDrop() メソッドは、Point 構造体を COM オブジェクトに適切にマーシャリングします。これは、Point が [ComVisible(true)] 属性を持っているため可能です。欠落している要素は、構造のレイアウトを記述する COM インターフェイスである IRecordInfo に必要な情報です。構造体のレイアウトはコンパイラに大きく依存するため、必須です。

このインターフェイスは、通常、タイプ ライブラリから構造定義を読み取ることによって実装されます。Point 構造体は c:\windows\microsoft.net\framework\v2.0.50727\system.drawing.tlb に記述されています。OleView.exe ツールの File + View Typelib で確認できます。

COMオブジェクトの受信者がそれを管理対象オブジェクトであるPointに変換しなければならない部分を除いて、すべてが良い. そのためには、IRecordInfo がその役割を果たせるように、どのタイプ ライブラリにオブジェクト定義が含まれているかを調べる必要があります。これは、レジストリ HKCR\Record キーに記録されます。ポイントのエントリが含まれていません。カブーム。

データを格納する独自のクラス (構造体ではない) を作成し、[Serializable] 属性を指定して、簡単にマーシャリングできるようにします。

于 2012-06-11T13:34:19.857 に答える
1

これはハックのように見えますが、これを行うことができます。私はそれが機能することをテストしました。 編集 それはなぜ答えないのだろうか?質問。

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);
        }

    }
于 2012-06-11T13:09:00.860 に答える