1

クリップボードを使用してコントロール インスタンスをコピー ペーストしようとしています。コントロールをコピーできますが、コピーしたオブジェクトを取り戻すことができません。

以下サンプルコード。

    [Serializable]
public class myControl
{
    private Control _copiedControl;
    public myControl(Control ctrl)
    {
        _copiedControl = ctrl;
    }

    public Control CopiedControl
    { 
        get 
        {
            return _copiedControl;
        }
        set 
        {
            _copiedControl = value;                
        }
    }
}

private void btnCopy_Click(object sender,EventArgs e)
{
    Clipboard.SetData("myControl", new myControl((Control)myButton));
}          

private void btnPaste_Click(object sender, EventArgs e)
{
    if(Clipboard.ContainsData("myControl"))
    {
                // Condition is satisfied here.. 

        myControl obj = Clipboard.GetData("myControl") as myControl;
                    // obj is null and control is lost..
        if(obj != null)
        {
            myPanel.Controls.Add(obj.CopiedControl);
        }
    }
}

GetData() メソッドを使用して、コピーされたコントロールを取得できません。何が間違っているのかわかりません。誰かが私を導くことができますか?

4

1 に答える 1

2

「myControl」をシリアライズ可能とマークしましたが、実際にはシリアライズ可能ではありません。Control クラスはバイナリのシリアライズをサポートしていません。コントロールに関連付けられたウィンドウの実行時状態に関する問題が多すぎます。これは、ウィンドウが 1 つの親しか持つことができないという事実から始まります。悲しいことに、Clipboard.SetData() メソッドはそれについて不平を言いません。

それには非常に簡単な回避策があります。クリップボードには単一のアイテムしか含めることができず、プロセス間のコピーは機能しません。したがって、それを偽造して、コントロールへの独自の参照を保持することもできます。このようなもの:

    private Control clipBoardRef;

    private void btnCopy_Click(object sender, EventArgs e) {
        clipBoardRef = myButton1;
        Clipboard.SetData("myControl", "it doesn't matter");
    }

    private void btnPaste_Click(object sender, EventArgs e) {
        if (Clipboard.ContainsData("myControl")) {
            Control ctl = clipBoardRef;
            // etc...
        }
    }
于 2013-01-03T14:27:28.937 に答える