复制TabControl选项卡

时间:2013-01-24 17:27:27

标签: c# winforms tabs tabcontrol

我搜索了互联网,但我找不到如何用C#

我想要做的是,当我点击我的NewTab按钮时,会出现一个新选项卡,其中包含第一个选项卡上的相同控件。我看到了一些有关如何在表单中添加UserControl的信息,但C#没有这样的内容。

对于每个会说“发布你的代码”的人,我都没有,所以不要打扰说,我唯一的代码就是程序的代码,这对任何人都无济于事。 / p>

3 个答案:

答案 0 :(得分: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

答案 1 :(得分: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);
    }

然后你需要挂钩事件处理程序。将不得不考虑这一点。

答案 2 :(得分: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);