2013-01-24 57 views
5

Bunun için internet arama amaKopya TabControl Tab

Ne yapmam çalışıyorum, benim NewTab butonuna tıkladığınızda böylece bunu yapmak yeni bir sekme olan C# ile bunu nasıl bulamadı İlk sekmede bulunan aynı kontrollerle görüntülenir. Formunuza UserControl ekleme hakkında bazı bilgiler gördüm, ancak C# böyle bir şeye sahip değil.

Ve "Kodunuzu postala" diyebilecek herkes için, hiç yok, bu yüzden söyleyeceğim tek kod, programın kodu ve bu kimseye yardımcı olmaz.

+3

C# bir UserControl sahip değil mi? 'Bu garip bir ifade. Evet, sekmenizin içeriği için bir UserControl yapın, sonra yeni bir sekme sayfası oluşturduğunuzda, bu UserControl'ı başlatır ve yeni TabPage denetimleri koleksiyonuna eklersiniz. Buna göre herhangi bir olay yapın. – LarsTech

+0

'UserControl'ü nerede bulabilirim? – Dozer789

+0

Başımın üst kısmına muhtemelen sekmeler koleksiyonuna bir sekme eklemeniz, ardından her bir denetimi yinelemeli olarak işleme koymanız, yeni bir örnek oluşturup yansıma kullanarak özellikleri kopyalayıp yeni sekmeye eklemeniz gerekir. Açıkçası bu kadar basit değil, ama başlamanıza neden olabilir. UserControl - C# projenize yeni bir UserControl öğesi eklemeyi ve onunla bir oyun oynamayı neden denemiyorsunuz? – Andez

cevap

8

EDIT

Çözümümü kullanmak için çözümümüzü yeniden yazdım.

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

Bazı bilgiler burada bulunabilir. http://www.codeproject.com/Articles/12976/How-to-Clone-Serialize-Copy-Paste-a-Windows-Forms

+0

ve bu kodu nereye koydum? "Yeni Sekme" düğmesine tıklayın veya "public Form1()'? – Dozer789

+1

Denetimleri yalnızca bir sekmeden diğerine taşır mıyım? – Andez

+0

Şablonun TabPage'in kontrolleri boyunca yineleyin ve klon yapın ve ardından yeni TabPage'ye ekleyin; Aksi halde kontrolü klonlamadan eklerseniz, kontrolleri sadece bir TabPage'den diğerine taşır. – Manish

1

Yapabileceğiniz en iyi şey, bu makalenin bakmak olacaktır:

Code Project

Sonra klonlanmış kontrolünü (bu düğme tıklama işleyici kodunda olurdu eklemek için aşağıdaki kodu uygulamak (maddeye dayalı):..

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

yukarı olay işleyicileri kanca gerekir bu düşünmek zorunda olacak

+0

Bunu "Yeni Sekme Düğmem" e ekledim ve hiçbir şey yapmıyor. – Dozer789

+0

Çözümü düzenledim - kodu buradan indirdiğinizden emin olun. – Andez

0

Bunun eski bir konu olduğunu biliyorum ama kendim için bir yol buldum ve paylaşmam gerektiğini düşündüm. Gerçekten basit ve test edilmiş .Net 4.6.

Lütfen bu çözümün yeni denetimler oluşturmadığını, yalnızca bunları yeni TabPage'ye yeniden atadığını unutmayın; bu nedenle, sekmeleri her değiştirdiğinizde AddRange'ı kullanmanız gerekir. Yeni sekme, içerdiği tam olarak aynı kontrolleri, içeriği ve değerleri gösterir.

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