Глубокое клонирование TabPageC#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Глубокое клонирование TabPage

Сообщение Anonymous »

У меня есть TabPage с несколькими панелями и вложенными в них элементами управления, такими как поля со списком, текстовые поля с маской, текстовые поля, кнопки, представления данных и т. д.
Моя цель — клонировать эту TabPage со всеми ее элементами управления и соответствующими обработчиками событий (например, comboBox_SelectedIndexChanged, textBox_TextChanged, button_Click и т. д.) в новую TabPage.
Для этой цели я создал класс TabPageCloner следующим образом:

Код: Выделить всё

using System;
using System.Windows.Forms;
using System.Reflection;

public class TabPageCloner
{
public static TabPage CloneTabPage(TabPage originalTab)
{
// Create a new TabPage instance
TabPage newTab = new TabPage(originalTab.Text);

// Clone each control on the original tab
foreach (Control control in originalTab.Controls)
{
Control clonedControl = CloneControl(control);
newTab.Controls.Add(clonedControl);
}

return newTab;
}

private static Control CloneControl(Control originalControl)
{
// Create an instance of the original control's type
Control newControl = (Control)Activator.CreateInstance(originalControl.GetType());

// Copy basic properties
newControl.Text = originalControl.Text;
newControl.Size = originalControl.Size;
newControl.Location = originalControl.Location;
newControl.Anchor = originalControl.Anchor;
newControl.Dock = originalControl.Dock;

// Clone any nested controls (for containers like Panels, GroupBoxes, etc.)
if (originalControl.HasChildren)
{
foreach (Control childControl in originalControl.Controls)
{
Control clonedChild = CloneControl(childControl);
newControl.Controls.Add(clonedChild);
}
}

// Clone event handlers
CloneEvents(originalControl, newControl);

return newControl;
}

private static void CloneEvents(Control originalControl, Control newControl)
{
// Use reflection to clone event handlers
EventInfo clickEvent = originalControl.GetType().GetEvent("Click");
if (clickEvent != null)
{
FieldInfo eventField = typeof(Control).GetField("EventClick", BindingFlags.Static | BindingFlags.NonPublic);
object eventDelegate = eventField?.GetValue(originalControl);

if (eventDelegate is EventHandler eventHandlers)
{
foreach (Delegate handler in eventHandlers.GetInvocationList())
{
clickEvent.AddEventHandler(newControl, handler);
}
}
}

}
}
Я использую его в своей основной форме следующим образом:

Код: Выделить всё

    TabPage clonedTabPage = TabPageCloner.CloneTabPage(MyOriginalTabPage);
tabControl1.TabPages.Add(clonedTabPage);
tabControl1.SelectedTab = clonedTabPage;
Проблема в том, что обработчики событий вообще не клонируются.
А также элементы ComboBox вообще не клонируются.
Что мне не хватает?

Подробнее здесь: https://stackoverflow.com/questions/790 ... -a-tabpage
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Глубокое клонирование TabPage
    Anonymous » » в форуме C#
    0 Ответы
    14 Просмотры
    Последнее сообщение Anonymous
  • Глубокое клонирование объектов
    Anonymous » » в форуме C#
    0 Ответы
    5 Просмотры
    Последнее сообщение Anonymous
  • Когда я перетаскиваю элементы управления на TabPage в дизайнере, они возвращаются в исходное положение.
    Anonymous » » в форуме C#
    0 Ответы
    13 Просмотры
    Последнее сообщение Anonymous
  • Исправить ошибку при закрытии TabPage с помощью MdiTabCtrl.1.0.0.1 nuget
    Anonymous » » в форуме C#
    0 Ответы
    5 Просмотры
    Последнее сообщение Anonymous
  • Клонирование выходного потока засорения с помощью C++
    Гость » » в форуме C++
    0 Ответы
    17 Просмотры
    Последнее сообщение Гость

Вернуться в «C#»