2012-04-22 41 views
7

thể trùng lặp:
It is possible to copy all the properties of a certain control? (C# window forms)Clone Controls - C# (Winform)

tôi phải tạo ra một số các điều khiển tương tự như một điều khiển tạo ra như thời gian thiết kế. Điều khiển được tạo nên có các thuộc tính giống như một điều khiển được xác định trước hoặc nói cách khác là tôi muốn sao chép một điều khiển. Có bất kỳ dòng mã nào cho mục đích đó không? hoặc tôi phải đặt từng thuộc tính bằng một dòng mã? Tôi đang làm ngay bây giờ là:

 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; 

Trả lời

17

Nói chung bạn có thể sử dụng phản ánh để sao chép các thuộc tính công khai của đối tượng sang một cá thể mới.

Khi giao dịch với Điều khiển, bạn cần phải thận trọng. Một số thuộc tính, như WindowTarget có nghĩa là chỉ được sử dụng bởi cơ sở hạ tầng khung công tác; vì vậy bạn cần phải lọc chúng ra.

Sau giờ làm việc lọc được thực hiện, bạn có thể viết những mong muốn một liner:

Button button2 = button1.Clone(); 

Dưới đây là một mã ít để giúp bạn bắt đầu:

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

Tất nhiên, bạn vẫn cần phải điều chỉnh đặt tên, vị trí vv Cũng có thể xử lý các điều khiển chứa.