在开发Winform项目中,经常会要切换不同的窗体。通常程序都有一个主窗体,在切换窗体时往往需要关闭其他子窗体,这个实例就来介绍MDI主窗体内嵌子窗体的实现方法。

MDI主窗体要设置一个比较重要的属性,IsMdiContainer=true。子窗体的 formChild.MdiParent设置成为主窗体。
- public MainForm()
- {
- InitializeComponent();
- //设置改窗体为MDI容器(多文档界面容器),可嵌入多个子窗体
- this.IsMdiContainer = true;
- }
-
- ///
- /// 通过子窗体名,打开子窗体
- ///
- ///
- ///
- private void OpenChildFrom(string childFromName)
- {
- bool bHave = false;
- //子窗体已存在 则打开
- foreach (Form formChild in this.MdiChildren)
- {
- if (formChild.Name == childFromName)
- {
- formChild.MdiParent = this;
- formChild.Activate();
- formChild.StartPosition = FormStartPosition.Manual;
- //填满主窗体空间
- formChild.Dock= DockStyle.Fill;
- formChild.Show();
- bHave = true;
- }
- else
- {
- formChild.Hide();
- }
- }
- //子窗体不存在 创建并打开
- if (bHave == false)
- {
- Form formChild = InitializeFormByName(childFromName);
- if (formChild != null)
- {
- formChild.MdiParent = this;
- formChild.StartPosition = FormStartPosition.Manual;
- //填满主窗体空间
- formChild.Dock = DockStyle.Fill;
- formChild.Show();
- }
- }
- }
-
- ///
- /// 用窗体名称字符串 初始化一个窗体
- ///
- ///
- ///
- public static Form InitializeFormByName(string formName, string nameSpace = null)
- {
- // 字符串是完整的类名,包括命名空间
- try
- {
- // 使用反射创建窗体实例
- //Type formType = Type.GetType("WinformDemo." + formName);
- Type formType = string.IsNullOrEmpty(nameSpace) ? Type.GetType("WinformDemo." + formName) : Type.GetType($"{nameSpace}." + formName);
- if (formType != null)
- {
- return (Form)Activator.CreateInstance(formType);
- }
- }
- catch (Exception ex)
- {
- // 处理异常,例如类型未找到或创建实例失败
- Console.WriteLine("Error: " + ex.Message);
- }
- return null;
- }
程序实例链接:https://download.csdn.net/download/lvxingzhe3/89422924