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

5

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

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

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

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

Ваш Ответ

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

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

Я добавил это к своей «новой кнопке вкладки», и она ничего не делает. Dozer789
Я отредактировал решение - убедитесь, что вы загружаете код оттуда. 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

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

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