2016-04-11 8 views
0

私はVS 2015でWindowsフォームアプリケーションを書いています。フォーム間でコントロールをコピーする代わりに

私はラジオの選択に基づいて、変更したいフォームの一部を持っています。変更したい部分をPanelコントロールに配置します。

私の現在の計画は、別のフォームに4つのコントロールレイアウトを作成することでした。私はForm2を作成し、それに4つのパネルを作成しました。ラジオボタンをクリックすると、Form2のパネルにあるものをForm1のPanelにコピーしたいと思います。

現在、各ラジオボタンをクリックすると、Form2パネルのコントロールが表示されなくなります。彼らはおそらく移動されて、コピーされていません。私が最初にクリックしたものはフォーム1に表示されますが、他は最初のものの後には表示されません。私はForm2(RefPanels)を全く変更したくありません。私はそこにあるものをForm1にコピーしたいだけです。ここに私が試みているコードがあります。

//RefPanels is my Form2 instance. 
public Form2 RefPanels = new Form2(); 

//Each Radiobutton has something similar to this. 
RadioBtn1_CheckChanged(...) 
{ 
    Control[] cArray = new Control[20]; 
    RefPanels.Panel1.Controls.CopyTo(cArray, 0); 

    foreach (Control c in cArray) 
    { 
    Form1_Destination_Panel.Controls.Add(c); 
    } 
} 

私はこれについてすべて間違っていると確信しています。手伝ってくれますか?

+0

Controls.CopyToは、コントロールへの参照のみをコピーするディープコピーを実行していません。それが彼らが動いている理由です - それらをデスティネーションパネルに追加すると、既存のコントロールを追加しています。 – Kateract

答えて

2

コントロールへの参照のみをコピーしています。しかし、コントロールは1つの形式でしか使用できません。したがって、コントロールは「古い」形式で消えてしまいます。コントロールの実際のコピーが必要です。

This Questionには、リフレクションによってコントロールをコピーする方法が記載されています。このようなソリューションでそれを試してみてください。

private void copyControl(Control sourceControl, Control targetControl) 
{ 
    // make sure these are the same 
    if (sourceControl.GetType() != targetControl.GetType()) 
    { 
     throw new Exception("Incorrect control types"); 
    } 

    foreach (PropertyInfo sourceProperty in sourceControl.GetType().GetProperties()) 
    { 
     object newValue = sourceProperty.GetValue(sourceControl, null); 

     MethodInfo mi = sourceProperty.GetSetMethod(true); 
     if (mi != null) 
     { 
      sourceProperty.SetValue(targetControl, newValue, null); 
     } 
    } 
} 
+0

ありがとう!私はこれが起こっていたと感じていた...しかし、あなたのリンクされた答えは、明確にするのに役立ちます –

0

私はあなたの希望のレイアウトのコントロールを含む各パネルのユーザーコントロールを作成することでこれを実現します。次に、別のレイアウトを選択すると、目的のユーザーコントロールクラスの新しいインスタンスを作成し、それを正しいコンテナに追加できます。これにより、メソッドなどのコントロールを保持することもできます。

+0

UCにcopyData(myUCclass sourceUC)関数を追加して、ソースUCからデータを書き込めるようにします。 – TaW