2013-01-24 16 views
5

Szukałem w internecie na to, ale nie mogłem znaleźć jak to zrobić z C#Kopiowanie TabControl Tab

co próbuję zrobić, to zrobić to tak, że po kliknięciu na moim przycisku NewTab, nowa karta pojawia się z tymi samymi kontrolkami, które znajdowały się na pierwszej karcie. Widziałem kilka informacji, jak dodać do formularza formularz UserControl, ale C# nie ma czegoś takiego.

I dla każdego, kto powiedziałby "Opublikuj swój kod", nie mam żadnych, więc nie zawracaj sobie głowy mówiąc, że jedynym kodem, jaki mam, jest kod programu, który nikomu nie pomógłby.

+3

'C# nie ma UserControl?' To jest dziwna instrukcja. Tak, ustaw UserControl na zawartość karty, a następnie, gdy tworzysz stronę nowej karty, twórz instancję UserControl i dodawaj ją do nowej kolekcji kontrolek TabPage. Połącz odpowiednio wszelkie zdarzenia. – LarsTech

+0

Gdzie mogę znaleźć 'UserControl'? – Dozer789

+0

W górnej części mojej głowy prawdopodobnie trzeba będzie dodać kartę do kolekcji kart, następnie iteracyjnie przetworzyć każdy z elementów sterujących, utworzyć nową instancję i skopiować właściwości za pomocą refleksji, a następnie dodać do nowej karty. Oczywiście nie jest to takie proste, ale może zacząć. UserControl - dlaczego nie spróbujesz dodać nowego elementu UserControl do swojego projektu C# i masz z nim zabawę. – Andez

Odpowiedz

8

EDIT

mam przepisany moje rozwiązanie, aby użyć refleksji.

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

Niektóre informacje można znaleźć tutaj. http://www.codeproject.com/Articles/12976/How-to-Clone-Serialize-Copy-Paste-a-Windows-Forms

+0

i gdzie mogę umieścić ten kod? w przycisku "Nowa karta" kliknij, lub w "public Form1()"? – Dozer789

+1

Czy wystarczy przesunąć elementy sterujące z jednej karty na drugą? – Andez

+0

Powtórz kontrolę elementów szablonu TabPage i sklonuj, a następnie dodaj do nowej strony TabPage; w przeciwnym razie, jeśli dodasz kontrolkę bez klonowania, po prostu przeniesiesz formanty z jednej TabPage na drugą. – Manish

1

Najprościej byłoby spojrzeć na ten artykuł:

Code Project

następnie zastosować poniższy kod, żeby dodać sklonowanego kontroli (to byłoby w przycisk Code Kliknij handler (na podstawie artykułu):..

private void button1_Click(object sender, EventArgs e) 
    { 
     // create new tab 
     TabPage tp = new TabPage(); 

     // iterate through each control and clone it 
     foreach (Control c in this.tabControl1.TabPages[0].Controls) 
     { 
      // clone control (this references the code project download ControlFactory.cs) 
      Control ctrl = CtrlCloneTst.ControlFactory.CloneCtrl(c); 
      // now add it to the new tab 
      tp.Controls.Add(ctrl); 
      // set bounds to size and position 
      ctrl.SetBounds(c.Bounds.X, c.Bounds.Y, c.Bounds.Width, c.Bounds.Height); 
     } 

     // now add tab page 
     this.tabControl1.TabPages.Add(tp); 
    } 

Wtedy trzeba by zahaczyć obsługi zdarzeń aż będą musieli myśleć o tym

+0

Dodałem to do mojego "przycisku nowej karty" i nic nie robi. – Dozer789

+0

Wcześniej edytowałem rozwiązanie - upewnij się, że ściągasz tam kod. – Andez

0

Wiem, że to stary wątek, ale właśnie znalazłem sposób dla siebie i pomyślałem, że powinienem się nim podzielić. To naprawdę proste i przetestowane w .Net 4.6.

Należy zauważyć, że to rozwiązanie w rzeczywistości nie tworzy nowych elementów sterujących, wystarczy je ponownie przypisać do nowej strony TabPage, więc za każdym razem przy zmianie kart należy używać funkcji Dodaj. Nowa karta wyświetli dokładnie te same kontrolki, zawartość i wartości.

// 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); 
Powiązane problemy