2013-01-24 140 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); 
相关问题