Почему мой динамически созданный TabPage не отображается? - PullRequest
0 голосов
/ 23 мая 2019

Я работаю с TabControl и TabPages. У меня уже есть встроенная TabPage с целым набором элементов управления, включая GroupBoxes. Я создал функцию, позволяющую клонировать элементы управления TabPage в новый. Поэтому я создаю новую TabPage, затем клонирую все первые элементы управления TabPage в новый (включая элементы управления GroupBoxes внутри новых GroupBoxes), затем добавляю новую TabPage в TabControl и выбираю его.

Button BT_Delete = new Button {
    BackColor = System.Drawing.SystemColors.ControlLight,
    Location = new System.Drawing.Point(6, 377),
    Name = "BT_Delete",
    Size = new System.Drawing.Size(75, 23),
    TabIndex = 1002,
    Text = "Delete",
    UseVisualStyleBackColor = false
};
Button BT_Save = new Button {
    BackColor = System.Drawing.SystemColors.ControlLight,
    Location = new System.Drawing.Point(87, 377),
    Name = "BT_Save",
    Size = new System.Drawing.Size(75, 23),
    TabIndex = 1001,
    Text = "Save",
    UseVisualStyleBackColor = false
};
Label LBL_Status = new Label {
    AutoSize = true,
    Location = new System.Drawing.Point(168, 382),
    Name = "LBL_Status",
    Size = new System.Drawing.Size(41, 13),
    TabIndex = 1003,
    Text = "Ready."
};
Button BT_Close = new Button {
    BackColor = System.Drawing.SystemColors.ControlLight,
    Location = new System.Drawing.Point(1059, 377),
    Name = "BT_Close",
    Size = new System.Drawing.Size(75, 23),
    TabIndex = 1003,
    Text = "Close",
    UseVisualStyleBackColor = false
};

TabPage newPage = new TabPage("Text");
newPage.Name = "Name"

ClonePage(TCP_New.Controls, newPage.Controls);
newPage.Controls.Add(BT_Delete);
newPage.Controls.Add(BT_Save);
newPage.Controls.Add(LBL_Status);
newPage.Controls.Add(BT_Close);
TC_Main.TabPages.Add(newPage);
TC_Main.SelectTab(newPage);

Теперь, когда все работает, новая вкладка TabPage добавлена ​​в TabControl, показывает отлично, и я также могу манипулировать данными.

Теперь проблема в том, что если я добавлю еще один, используя ту же функцию, ящики группы и их содержимое не будут отображаться. Однако кнопки и метка работают нормально. Я могу видеть их и взаимодействовать с ними. Поэтому я думаю, что проблема заключается в моем клонировании групповых ящиков и их содержимого, но я не могу понять, где и почему.

Вот моя функция клонирования ControlCollection (из TabPage):

private void ClonePage(Control.ControlCollection from, Control.ControlCollection to) {
    foreach (Control c in from) {
        if (c is GroupBox) {
            GroupBox gbx = (c as GroupBox).Clone();
            to.Add(gbx);

            foreach (Control child in (c as GroupBox).Controls) {
                if (child is Label) {
                    Label lbl = (child as Label).Clone();
                    gbx.Controls.Add(lbl);
                } else if (child is TextBox) {
                    TextBox tbx = (child as TextBox).Clone();
                    gbx.Controls.Add(tbx);
                } else if (child is CheckBox) {
                    CheckBox cbx = (child as CheckBox).Clone();
                    gbx.Controls.Add(cbx);
                } else if (child is NumericUpDown) {
                    NumericUpDown nup = (child as NumericUpDown).Clone();
                    gbx.Controls.Add(nup);
                } else if (child is Button) {
                    Button btn = (child as Button).Clone();
                    gbx.Controls.Add(btn);
                } else if (child is ComboBox) {
                    ComboBox cbb = (child as ComboBox).Clone();
                    gbx.Controls.Add(cbb);
                }
            }
        }
    }
}

А вот моя функция Clone ():

public static T Clone<T>(this T controlToClone) where T : Control {
    PropertyInfo[] controlProperties = typeof(T).GetProperties(BindingFlags.Public | BindingFlags.Instance);

    T instance = Activator.CreateInstance<T>();

    if (controlToClone is ComboBox) {
        foreach (string i in (controlToClone as ComboBox).Items) {
            (instance as ComboBox).Items.Add(i);
        }
    }

    foreach (PropertyInfo propInfo in controlProperties) {
        if (propInfo.CanWrite) {
            if (propInfo.Name != "WindowTarget") {
                propInfo.SetValue(instance, propInfo.GetValue(controlToClone, null), null);
            }
        }
    }

    return instance;
}

Любая помощь приветствуется, я застрял здесь.

...