TabPageを動的に追加する場合、細かい設定は面倒なので、デザイナーで作っておいて複写したい。
TabPage、中に入れるControlどちらも、インスタンスに対して必要なプロパティを直接指定(nPage.Text = oPage.Textのように)した方が楽だけど、今回は自動で渡してみた。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
public partial class CustomerDescription : Form { public CustomerDescription() { InitializeComponent(); tabControl1.TabPages.Add(TabPageClone(tabPage1, "hello")); tabControl1.TabPages.Add(TabPageClone(tabPage1, "world")); tabControl1.TabPages.Remove(tabPage1); } private TabPage TabPageClone(TabPage oPage, string pageCaption) { TabPage nPage = new TabPage(); nPage.Text = pageCaption; foreach (var pi in typeof(TabPage).GetProperties()) { var propInfo = typeof(TabPage).GetProperty(pi.Name, BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); if (propInfo != null && propInfo.PropertyType.IsValueType && propInfo.CanWrite && propInfo.CanRead) { propInfo.SetValue(nPage, propInfo.GetValue(oPage)); } } foreach (Control oCtrl in oPage.Controls) { Control nCtrl = (Control)Activator.CreateInstance(oCtrl.GetType()); //Control nCtrl = (Control)oCtrl.GetType().GetConstructor(Type.EmptyTypes).Invoke(null); foreach (var pi in oCtrl.GetType().GetProperties()) { var propInfo = oCtrl.GetType().GetProperty(pi.Name, BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); //var propInfo = oCtrl.GetType().GetProperty(pi.Name).GetAccessors().First().GetBaseDefinition().DeclaringType.GetProperty(pi.Name); if (propInfo != null && propInfo.PropertyType.IsValueType && propInfo.CanWrite && propInfo.CanRead) propInfo.SetValue(nCtrl, propInfo.GetValue(oCtrl)); } nPage.Controls.Add(nCtrl); nCtrl.Visible = true; } return nPage; } } |