复制TabControl选项卡

7
我在互联网上搜索了一下,但是我没有找到如何使用C#来实现这个功能。
我的目标是:当我点击“NewTab”按钮时,出现一个新的选项卡,它包含与第一个选项卡相同的控件。我发现有些信息可以向你的表单中添加“UserControl”,但是C#没有类似的东西。
对于那些会说“张贴你的代码”的人,我没有任何代码,所以不要浪费时间说这种话,我唯一拥有的代码就是程序本身,这并不能帮助任何人。

4
“C# 没有 UserControl?”这个说法很奇怪。是的,为您的选项卡内容创建一个 UserControl,然后当您创建新的选项卡页时,实例化该 UserControl 并将其添加到新的 TabPage 控件集合中。相应地连接任何事件即可。 - LarsTech
我在哪里可以找到“UserControl”? - Dozer789
仅凭我的记忆,您可能需要将一个选项卡添加到选项卡集合中,然后迭代处理每个控件,使用反射创建一个新实例并复制属性,然后将其添加到新选项卡中。显然不是这么简单,但可能会让您有所启发。 UserControl - 为什么不尝试将一个新的UserControl项目添加到您的C#项目中,并进行一些尝试呢? - Andez
刚刚发现我需要将它添加到代码中,我之前总是通过从工具箱拖动来实现。 - Dozer789
我刚刚通过代码添加了UserControl,我应该用不同的方式吗? - Dozer789
3个回答

9

编辑

我已经重写了我的解决方案,使用了反射技术。

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 这里提供了与IT技术有关的内容。

那段代码放在哪里呢?放在“New Tab”按钮的点击事件中还是public Form1()中? - Dozer789
1
只是将控件从一个选项卡移动到另一个选项卡吗? - Andez
遍历模板TabPage的控件,进行克隆并添加到新的TabPage;否则,如果不进行克隆直接添加控件,则会将控件从一个TabPage移动到另一个TabPage。 - Manish
可以这样做,但是我发现当我这样做时,刚刚添加的另一个选项卡上的控件变得无用了,我无法点击它们,而且当我切换选项卡时,原本存在控件的位置变成了完全的白色。有什么办法可以解决这个问题吗? - Dozer789

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

接下来,您需要连接事件处理程序。我需要考虑一下。


我将这个添加到我的“新标签按钮”上,但它没有任何作用。 - Dozer789
我已经编辑了解决方案 - 确保你从那里下载代码。 - Andez

1

我知道这是一个旧的线程,但我刚刚为自己找到了一种方法,想分享一下。它非常简单,并且在.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);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接