2016-04-11 13 views
0

Ben Windows bir radyo seçimine dayalı, VS 2015formlar arasında bir Kontrolü Kopyalama yerine

ben değiştirmek istediğiniz formun parçası var Forms uygulaması yazıyorum hareket eder. Değiştirmek istediğim kısım bir Panel kontrolüne koydum.

Şu anki planım, başka bir formda 4 denetim mizanpajı oluşturmaktı. Form2'yi oluşturdum ve üzerine 4 panel oluşturdum. Radyo butonu tıklandığında Form2'den Form1'e kadar olan panelde neler olduğunu kopyalamak istiyorum.

Şu anda, her radyo düğmesini tıklattığımda, Form2 Panel'deki denetimler kaybolur! Belki de taşınıyorlar, kopyalanmıyorlar. Tıkladığım ilk şey Form 1'de görünür, ancak diğerleri ilkinden sonra olmaz. Form2'nin (RefPanels) hiç değişmesini istemiyorum. Sadece Form1'e ne olduğunu kopyalamak istiyorum. İşte denediğim kod.

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

Eminim bu konuda yanlış gidiyorum. Yardım edebilir misin?

+0

Controls.CopyTo derin bir kopya yapmıyor, yalnızca başvuruları denetimlere kopyalıyor. Bu yüzden hareket ediyorlar - onları hedef panele eklediğinizde, kontrolünü ekliyorsunuz. – Kateract

cevap

2

Referansı yalnızca kontrolünüze kopyalarsınız. Ancak bir kontrol sadece bir formda kullanılabilir. Böylece kontrol "eski" biçimde yok oluyor. Kontrollerin gerçek kopyalarına ihtiyacın var.

This Question, bir denetimi yansıtma yoluyla kopyalamanın bir yolunu açıklar. Böyle bir çözüm ile Deneyin:

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

Teşekkürler! Bunun olup bittiğini hissetmiştim ... Ama bağlantılı cevabınız –

0

ben istediğiniz düzende kontrolleri içeren her panel için bir kullanıcı denetimi oluşturarak bunu gerçekleştirmek olacaktır. Daha sonra, farklı bir düzen seçtiğinizde, istenen kullanıcı kontrol sınıfının yeni bir örneğini oluşturabilir ve bunu doğru konteynere ekleyebilirsiniz. Bu ayrıca yöntemleri ve benzeri kontrolleri tutmanıza izin verecektir.

+0

'u açıklığa kavuşturmaya yardımcı olur. Ayrıca UC'ye bir copyData (myUCclass sourceUC) işlevi ekleyebilmeniz için kaynak UC'den verileri doldurabilirsiniz. – TaW