【问题标题】:Copy TabControl Tab复制 TabControl 选项卡
【发布时间】:2013-01-24 17:27:26
【问题描述】:

我在互联网上搜索了这个,但我找不到如何用 C# 来做

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

对于每个会说“发布您的代码”的人,我没有任何代码,所以不要费心这么说,我拥有的唯一代码是程序的代码,这对任何人都没有帮助。

【问题讨论】:

  • C# doesn't have a UserControl? 这是一个奇怪的说法。是的,为选项卡的内容创建一个 UserControl,然后在创建新的选项卡页时,实例化该 UserControl 并将其添加到新的 TabPage 控件集合中。相应地连接任何事件。
  • 我在哪里可以找到UserControl
  • 在我的脑海中,您可能必须向选项卡集合添加一个选项卡,然后迭代处理每个控件,创建一个新实例并使用反射复制属性,然后添加到新选项卡.显然没有这么简单,但可能会让你开始。 UserControl - 为什么不尝试将新的 UserControl 项添加到您的 C# 项目并尝试一下。
  • 刚发现我必须将它添加到代码中,我总是看到如何通过从工具箱中拖动它来完成。
  • 我刚刚通过代码添加了UserControl,我应该用其他方式吗?

标签: c# winforms tabs tabcontrol


【解决方案1】:

编辑

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

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

【讨论】:

  • 我该把代码放在哪里?在“新标签”按钮中单击,或在public Form1()?
  • 只是将控件从一个选项卡移动到另一个选项卡?
  • 遍历模板TabPage的控件并进行克隆然后添加到新的TabPage;否则,如果您在不克隆的情况下添加控件,它只会将控件从一个 TabPage 移动到另一个。
  • 那行得通,接受当我这样做时,我刚刚添加的另一个选项卡上的控件没用,我无法单击它们,当我更改选项卡时,控件所在的位置只是完全白色。有什么办法解决吗?
【解决方案2】:

你最好看看这篇文章:

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

然后您需要连接事件处理程序。将不得不考虑这一点。

【讨论】:

  • 我将此添加到我的“新标签按钮”中,但它什么也没做。
  • 我已经编辑了解决方案 - 请确保您从那里下载代码。
【解决方案3】:

我知道这是一个旧线程,但我只是为自己想出了一个方法,并认为我应该分享它。它非常简单,并且在 .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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-14
    • 2012-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多