2016-04-11 9 views
0

Ich schreibe ein Windows Forms-Anwendung in VS 2015eine Steuerung zwischen Formen Kopieren bewegt er stattdessen

ich einen Teil der Form, die ich will, auf einer Funk Auswahl basierte ändern. Den Teil, den ich ändern möchte, lege ich in ein Panel-Steuerelement.

Mein aktueller Plan war, 4 Steuerlayouts auf einem anderen Formular zu erstellen. Ich habe Form2 erstellt und 4 Panels darauf erstellt. Ich möchte kopieren, was in diesen Panels von Form2 zu dem Panel in Form1 ist, wenn das Optionsfeld geklickt wird.

Derzeit, wenn ich auf jedes Optionsfeld klicke, verschwinden die Steuerelemente in Form2 Panel! Sie werden vielleicht bewegt, nicht kopiert. Das erste, auf das ich klicke, erscheint auf Form 1, aber die anderen nicht nach dem ersten. Ich möchte nicht, dass Form2 (RefPanels) überhaupt geändert wird. Ich möchte nur kopieren, was zu Form1 da ist. Hier ist der Code, den ich versuche.

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

Ich bin mir sicher, dass ich alles falsch mache. Kannst du helfen?

+0

Controls.CopyTo führt keine tiefe Kopie durch und kopiert nur die Verweise auf die Steuerelemente. Deshalb bewegen sie sich - wenn Sie sie zum Ziel-Panel hinzufügen, fügen Sie das bestehende Steuerelement hinzu. – Kateract

Antwort

2

Sie kopieren nur die Referenz zu Ihrer Steuerung. Aber ein Steuerelement kann nur in einer Form verwendet werden. Die Kontrolle verschwindet also in der "alten" Form. Sie benötigen echte Kopien Ihrer Steuerelemente.

This Question beschreibt eine Möglichkeit, eine Kontrolle über Reflexion zu kopieren. Versuchen Sie es mit einer Lösung wie folgt aus:

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

Danke! Ich hatte das Gefühl, das war was los war ... Aber Ihre verknüpfte Antwort hilft zu klären –

0

Ich würde dies durch eine Benutzersteuerung für jede Platte zu schaffen, die Kontrollen in der gewünschten Layout enthält. Wenn Sie dann ein anderes Layout auswählen, können Sie eine neue Instanz der gewünschten Benutzersteuerungsklasse erstellen und diese zum richtigen Container hinzufügen. Dies ermöglicht Ihnen auch, die Methoden und solche für die Kontrollen zu behalten.

+0

Fügen Sie auch eine copyData (myUCclass sourceUC) -Funktion zum UC hinzu, so dass Sie die Daten von der Quelle UC ausfüllen können. – TaW

Verwandte Themen