2013-01-24 179 views
5

我搜索這個互聯網,但我找不到如何用C#做複製的TabControl選項卡

什麼,我要做的是讓這個當我在我的NewTab按鈕點擊,一個新的標籤與第一個標籤上的控件相同。我看到了一些關於如何在表單中添加UserControl的信息,但C#沒有這樣的東西。

對於每個想說「發佈你的代碼」的人來說,我沒有任何東西,所以不要擔心,我唯一的代碼是程序的代碼,並不會幫助任何人。

+3

'C#沒有UserControl?'這是一個奇怪的說法。是的,爲您的選項卡的內容製作一個UserControl,然後在製作新的選項卡頁時,將實例化該UserControl並將其添加到新的TabPage控件集合中。相應地連接任何事件。 – LarsTech

+0

我在哪裏可以找到UserControl? – Dozer789

+0

關閉我的頭頂上,你可能需要添加一個選項卡到選項卡集合,然後迭代地處理每個控件,創建一個新的實例並使用反射覆制屬性,然後添加到新選項卡。顯然不像這樣簡單,但可能會讓你開始。 UserControl - 爲什麼不嘗試向你的C#項目添加一個新的UserControl項目並且玩一玩。 – Andez

回答

8

編輯

我已經改寫了我的解決方案以使用反射。

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

有些信息可以在這裏找到。 http://www.codeproject.com/Articles/12976/How-to-Clone-Serialize-Copy-Paste-a-Windows-Forms

+0

以及我在哪裏放置該代碼?點擊「新建選項卡」按鈕,或在「公共Form1()」中? – Dozer789

+1

只是將控件從一個標籤移動到另一個標籤? – Andez

+0

迭代模板TabPage的控件並進行克隆,然後添加到新的TabPage;否則,如果添加控件而不克隆它,它將簡單地將控件從一個TabPage移動到另一個TabPage。 – Manish

1

您最好的選擇是看這篇文章:

Code Project

然後應用下面的代碼添加克隆控制(這將是您的按鈕單擊處理程序代碼(基於文章):

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

那麼你就需要掛鉤的事件處理起來將不得不考慮這個

+0

我將此添加到我的「新選項卡按鈕」,它什麼都不做。 – Dozer789

+0

我編輯瞭解決方案 - 確保你從那裏下載代碼。 – Andez

0

我知道這是一條古老的線索,但我只是想出了一條適合自己的方式,並認爲我應該分享它。它非常簡單,並且在.Net 4.6中進行了測試。

請注意,此解決方案實際上並未創建新控件,只是將它們全部重新分配給新的TabPage,因此每次更改選項卡時都必須使用AddRange。新標籤會顯示完全相同的控件,內容和值。

// 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); 
相關問題