Я работаю с 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;
}
Любая помощь приветствуется, я застрял здесь.