7
votes

Copier Tabcontrol Tab

J'ai recherché sur Internet pour cela, mais je n'ai pas pu trouver comment le faire avec c #

Ce que j'essaie de faire est de le faire, de sorte que lorsque je clique sur mon bouton NewTab , un nouvel onglet apparaît avec les mêmes commandes figurant sur le premier onglet. J'ai vu des informations sur la manière d'ajouter un usercontrol à votre formulaire, mais c # n'a rien de tel.

Et pour tous ceux qui diraient "Poster votre code", je ne l'ai pas, alors ne vous inquiétez pas de dire que le seul code que j'ai est le code du programme et qui n'aiderait personne. < / p>


5 commentaires

C # n'a pas de UserControl? c'est une déclaration étrange. Oui, faites un usercontrol pour le contenu de votre onglet, puis lorsque vous effectuez une nouvelle page d'onglet, vous instaniez-le à UserControl et l'ajoutez à la nouvelle collection de contrôles Tabpage. Faites un câblage des événements en conséquence.


Où puis-je trouver le usercontrol ?


En haut de ma tête, vous devrez probablement ajouter un onglet à la collection Tabs, puis traiter de manière itérative chaque contrôle, créer une nouvelle instance et copier les propriétés à l'aide de la réflexion, puis ajoutez à la nouvelle onglet. Évidemment pas aussi simple que cela, mais pourrait vous aider à démarrer. Usercontrol - Pourquoi n'essayez-vous pas d'ajouter un nouvel objet USERCONTROL à votre projet C # et avez-vous une pièce de théâtre avec elle.


Je suis juste compris que je devais l'ajouter au code, j'ai toujours vu comment le faire en le faisant glisser à partir de la boîte à outils.


Je viens d'ajouter le usercontrol par code, dois-je faire une manière différente?


3 Réponses :


9
votes

Edit

J'ai réécrit ma solution pour utiliser la réflexion. P>

using System.Reflection;

// your TabControl will be defined in your designer
TabControl tc;
// as will your original TabPage
TabPage tpOld = tc.SelectedTab;

TabPage tpNew = new TabPage();
foreach(Control c in tpOld.Controls)
{
    Control cNew = (Control) Activator.CreateInstance(c.GetType());

    PropertyDescriptorCollection pdc = TypeDescriptor.GetProperties(c);

    foreach (PropertyDescriptor entry in pdc)
    {
        object val = entry.GetValue(c);
        entry.SetValue(cNew, val);
    }

    // add control to new TabPage
    tpNew.Controls.Add(cNew);
}

tc.TabPages.Add(tpNew);


4 commentaires

et où dois-je mettre ce code? Dans le bouton "Nouveau onglet", cliquez sur ou dans le formulaire PUBLIC1 () ?


Déplacerait-il les commandes d'un onglet à l'autre?


ITERER à travers les commandes du Tabage de modèle et faites du clone, puis ajoutez-le au nouveau Tabpage; Sinon, si vous ajoutez le contrôle sans clonage, il suffira simplement de déplacer les commandes d'un Tabpage à d'autres.


Cela fonctionne, accepte que lorsque je le fais, les commandes de l'autre onglet que j'ai ajoutées sont inutiles, je ne peux pas les cliquer et quand je modifie les onglets, où les commandes étaient tout simplement entièrement blanches. Toute façon de résoudre ce problème?



1
votes

Votre meilleur pari serait de regarder cet article:

Projet de code

Appliquez ensuite le code suivant pour ajouter le contrôle cloné (ceci serait dans votre bouton Cliquez sur le code du gestionnaire (basé sur l'article): < / p> xxx

Ensuite, vous devez accroître les gestionnaires d'événements vers le haut. Devra penser à cela.


2 commentaires

J'ai ajouté ceci à mon "nouveau bouton d'onglet" et ça ne fait rien.


J'ai édité la solution - assurez-vous de télécharger le code à partir de là.



1
votes

Je sais que c'est un vieux fil mais je viens de comprendre un moyen pour moi et pensais que je devrais la partager. C'est vraiment simple et testé à .NET 4.6.

Veuillez noter que cette solution ne crée pas de nouvelles commandes, il suffit de les réaffecter à nouveau à un nouveau Tableau, de sorte que vous devez utiliser AddRange chaque fois que vous modifiez des onglets. Un nouvel onglet affiche exactement les mêmes commandes, les mêmes contrôles, les mêmes valeurs inclus. P>

// Create an array and copy controls from first tab to it.
Array tabLayout = new Control [numberOfControls];
YourTabControl.TabPages[0].Controls.CopyTo(tabLayout, 0);

// AddRange each time you change a tab.
YourTabControl.TabPages[newTabIndex].Controls.AddRange((Control[])tabLayout);


0 commentaires