2012-04-22 10 views
7

可能性の重複:
It is possible to copy all the properties of a certain control? (C# window forms)クローンコントロール - C#の(Winフォーム)

私は、設計時に作成制御と同様、いくつかのコントロールを作成する必要があります。作成されたコントロールは、定義済みのコントロールと同じプロパティを持つ必要があります。つまり、コントロールをコピーします。その目的のために一行のコードがありますか?または、コードの行ごとに各プロパティを設定する必要がありますか?私が今やっている は次のとおりです。

 ListContainer_Category3 = new FlowLayoutPanel(); 
     ListContainer_Category3.Location = ListContainer_Category1.Location; 
     ListContainer_Category3.BackColor = ListContainer_Category1.BackColor; 
     ListContainer_Category3.Size = ListContainer_Category1.Size; 
     ListContainer_Category3.AutoScroll = ListContainer_Category1.AutoScroll; 

答えて

17

は、一般的には、新しいインスタンスへのオブジェクトのパブリックプロパティをコピーするためにリフレクションを使用することができます話します。

しかし、コントロールを扱う場合は、慎重にする必要があります。 WindowTargetのような一部のプロパティは、フレームワークインフラストラクチャによってのみ使用されることを意図しています。フィルタリングする必要があります。

フィルタリング作業が完了したら、あなたが希望ワンライナーを書くことができますが:

Button button2 = button1.Clone(); 

ここであなたが始めるために少しのコードです:もちろん

public static class ControlExtensions 
{ 
    public static T Clone<T>(this T controlToClone) 
     where T : Control 
    { 
     PropertyInfo[] controlProperties = typeof(T).GetProperties(BindingFlags.Public | BindingFlags.Instance); 

     T instance = Activator.CreateInstance<T>(); 

     foreach (PropertyInfo propInfo in controlProperties) 
     { 
      if (propInfo.CanWrite) 
      { 
       if(propInfo.Name != "WindowTarget") 
        propInfo.SetValue(instance, propInfo.GetValue(controlToClone, null), null); 
      } 
     } 

     return instance; 
    } 
} 

が、あなたはまだ調整する必要があります名前付け、場所など。また、含まれているコントロールを扱うこともできます。

関連する問題