Вопрос по tabs, tabcontrol, winforms, c# – Копировать TabControl Tab

5

Я искал в интернете это, но я не могне могу найти, как это сделать с помощью C #

То, что я пытаюсь сделать, это сделать так, чтобы, когда я нажимаю на мойNewTab Кнопка, новая вкладка появляется с теми же элементами управления, которые были на первой вкладке. Я видел некоторую информацию о том, как добавитьUserControl к вашей форме, но C # неНичего подобного.

И для всех, кто скажетРазместите свой кодя ненет, так что нене говорите, что единственный код, который у меня есть, это код для программы, и это неникому не помогу.

Просто понял, что мне нужно добавить его в код, я всегда видел, как это сделать, перетаскивая его из панели инструментов. Dozer789
я просто добавилUserControl по коду, я должен сделать это по-другому? Dozer789
Где я могу найти?UserControl Dozer789
С моей головы тыВозможно, придется добавить вкладку в коллекцию вкладок, затем итеративно обработать каждый элемент управления, создать новый экземпляр и скопировать свойства, используя отражение, а затем добавить на новую вкладку. Очевидно, не так просто, как это, но может помочь вам начать. UserControl - почему неВы пытаетесь добавить новый элемент UserControl в ваш проект C # и поиграть с ним. Andez

Ваш Ответ

3   ответа
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);
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

Ответ обновлен, чтобы отразить Andez ' и Маниш Комментарии Lorcan O'Neill
и где я могу поместить этот код? в "Новая вкладка" нажатие кнопки или в?public Form1() Dozer789
Это работает, примите, что когда я это сделаю, элементы управления на другой вкладке, которые я только что добавил, бесполезны, я могуЯ нажимаю на них, и когда я меняю вкладки, там, где были элементы управления, он просто полностью белый. Есть ли способ это исправить? Dozer789
Будет ли просто переместить элементы управления с одной вкладки на другую? Andez
Переберите элементы управления шаблона TabPage и создайте клон, а затем добавьте его в новый TabPage; в противном случае, если вы добавите элемент управления без клонирования, он просто переместит элементы управления с одной вкладки на другую. Manish
1

Лучше всего будет посмотреть на эту статью:

Код проекта

Затем примените следующий код, чтобы добавить клонированный элемент управления (это будет код вашего обработчика нажатий кнопок (на основе статьи):

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

Тогда вам нужно будет подключить обработчики событий. Придется подумать об этом.

ve отредактированное решение - убедитесь, что вы загружаете код оттуда. Andez
Я добавил это в мой "Кнопка «Новая вкладка» и это ничего не делает. Dozer789

Похожие вопросы