2012-04-22 6 views
7

가능한 중복 :
It is possible to copy all the properties of a certain control? (C# window forms)복제 컨트롤 - C#을 (의 WinForm)

내가 설계 시간으로 만들어 제어와 비슷한 컨트롤을 만들어야합니다. 생성 된 컨트롤은 미리 정의 된 컨트롤과 동일한 속성을 가져야합니다. 즉 컨트롤을 복사하려고합니다. 그 목적을위한 단일 코드 줄이 있습니까? 또는 코드 줄로 각 속성을 설정해야합니까? 내가 지금 잘하고 있는가하는 것은 :

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

을, 당신은 여전히 ​​조정해야 이름 지정, 위치 등. 또한 포함 된 컨트롤을 처리 할 수도 있습니다.