最近需要做的一個項目,為了避免從菜單中選擇的麻煩,需要把幾個表單整合到一起,通過TabControl選項卡來切換,這樣的設計實現在一定程度上也是實現了代碼的複用,擴充思路來說我們可以把一些小的功能做到表單裡在需要的時候在容器中載入即可,這樣也可以避免使用使用者控制項時經常報錯的問題。這個功能和之前做的一個通過菜單選擇將表單載入到選項卡中類似,不同的是激發的源頭不同,我們來看一下吧。
專案檔組織:
主程式介面:
將tabControl1中的兩個選項頁的tag分別寫上form2和form3的類名稱。
被包含表單Form2:
被包含表單Form3:
運行結果:from2和form3兩個表單都整合到form1中的選項卡中顯示:
Form1實現代碼:
using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Reflection;using System.Text;using System.Windows.Forms;namespace tabWindowTest{ public partial class Form1 : Form { public int[] s = {0, 0}; //用來記錄from是否開啟過 public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { //初始開啟時就載入Form2 string formClass = "tabWindowTest.Form2"; GenerateForm(formClass, tabControl1); } private void tabControl1_SelectedIndexChanged(object sender, EventArgs e) { if(s[tabControl1.SelectedIndex]==0) //只產生一次 { btnX_Click(sender, e); } } /// <summary> /// 通用按鈕點擊選項卡 在選項卡上顯示對應的表單 /// </summary> private void btnX_Click(object sender, EventArgs e) { string formClass = ((TabControl)sender).SelectedTab.Tag.ToString(); //string form = tabControl1.SelectedTab.Tag.ToString(); GenerateForm(formClass, sender); } //在選項卡中產生表單 public void GenerateForm(string form, object sender) { // 反射產生表單 Form fm = (Form)Assembly.GetExecutingAssembly().CreateInstance(form); //設定表單沒有邊框 加入到選項卡中 fm.FormBorderStyle = FormBorderStyle.None; fm.TopLevel = false; fm.Parent = ((TabControl)sender).SelectedTab; fm.ControlBox = false; fm.Dock = DockStyle.Fill; fm.Show(); s[((TabControl)sender).SelectedIndex] = 1; } }}