最近需要做的一個項目,為了避免從菜單中選擇的麻煩,需要把幾個窗體集成到一起,通過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);
}
}
///
/// 通用按鈕點擊選項卡 在選項卡上顯示對應的窗體
///
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;
}
}
}