2015-12-07 2 views
0

J'ai donc une page d'onglet modèle dans mon onglet de contrôle qui contient une zone de texte multiligne, un bouton, une barre de progression et une étiquette. J'ai essayé de chercher le clonage de la page de l'onglet modèle et de l'ajouter à mon contrôle onglet, mais pour une raison quelconque, il se bloque à un moment donné à mi-chemin à travers. Est-ce parce que la page de l'onglet a des contrôles à l'intérieur? Dois-je cloner chaque contrôle, puis les ajouter à une nouvelle page à onglet? Est-il simplement plus facile de créer ces contrôles et de simplement définir les valeurs lors de l'exécution? Je me dis que je dois me tromper parce que j'ai de la difficulté à trouver des informations à ce sujet.comment cloner une page à onglet "modèle" C#

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

question de côté, cela semble que cela pourrait avoir un chevauchement de nom, ou est-ce que pas d'importance puisque chaque contrôle appartient à une page de l'onglet différent?

Répondre

0

Le premier problème que vous rencontrerez avec cette solution est que vous copiez les ID de contrôle, ce qui créera des conflits dans la collection "Controls" du contrôle parent. De même, lorsque vous appelez "GetProperties()", vous devriez utiliser l'enum BindingFlags pour vous assurer que vous saisissez uniquement les propriétés Instance, Public qui ont un accesseur "Set". Vous pouvez ensuite supprimer l'appel supplémentaire pour "GetSetMethod()".

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(BindingFlags.Public | BindingFlags.Instance | BindingFlags.SetProperty)) 
     { 
      object newValue = sourceProperty.GetValue(sourceControl, null); 
      sourceProperty.SetValue(targetControl, newValue, null); 
     } 
    } 
+0

hmm il semble encore à l'échec quand il arrive à System.Drawing.Size PreferredSize – gbux

+0

Quel est le message d'erreur que vous obtenez? Aussi, pouvez-vous inclure un exemple d'un appelant à cela? Je suppose que vous créez le "targetControl" avant de l'appeler (ou vous obtiendrez une exception NullReferenceException). Ajoutez-vous la cible à la collection Controls du parent avant ou après avoir appelé cette méthode? –