http://blog.csdn.net/upi2u/article/details/37914909

最近需要做的一个项目,为了避免从菜单中选择的麻烦,需要把几个窗体集成到一起,通过TabControl选项卡来切换,这样的设计实现在一定程度上也是实现了代码的复用,扩展思路来说我们可以把一些小的功能做到窗体里在需要的时候在容器中加载即可,这样也可以避免使用用户控件时经常报错的问题。这个功能和之前做的一个通过菜单选择将窗体加载到选项卡中类似,不同的是激发的源头不同,我们来看一下吧。

项目文件组织:

主程序界面:

将tabControl1中的两个选项页的tag分别写上form2和form3的类名称。

被包含窗体Form2:

被包含窗体Form3:

运行结果:from2和form3两个窗体都集成到form1中的选项卡中显示:

Form1实现代码:

[csharp] view plain copy print?
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;  
  
        }  
    }  
}

C#开发 WinForm如何在选项卡中集成加载多个窗体 实现窗体复用的更多相关文章

  1. iOS开发UI篇—在UItableview中实现加载更多功能

    一.实现效果 点击加载更多按钮,出现一个加载图示,三秒钟后添加两条新的数据.                      二.实现代码和说明 当在页面(视图部分)点击加载更多按钮的时候,主页面(主控制器 ...

  2. C#开发PACS医学影像处理系统(六):加载Dicom影像

    对于一款软件的扩展性和维护性来说,上层业务逻辑和UI表现一定要自己开发才有控制权,否则项目上线之后容易被掣肘, 而底层图像处理,我们不需要重复造轮子,这里推荐使用fo-dicom,同样基于Dicom3 ...

  3. SpringBoot开发 - 什么是热部署和热加载?devtool的原理是什么?

    在SpringBoot开发调试中,如果我每行代码的修改都需要重启启动再调试,可能比较费时间:SpringBoot团队针对此问题提供了spring-boot-devtools(简称devtools)插件 ...

  4. unity中ScriptableObject在assetbundle中的加载

    转载请标明出处:http://www.cnblogs.com/zblade/ 以前都是写一些个人的调研博客,从今天开始,也写一些个人在开发中遇到的一些可以分享的趟坑博客,为后续的开发人员提供一些绵薄之 ...

  5. iOS中wkwebview加载本地html的要点

    项目中有些页面,我采用了html页面开发,然后用wkwebview加载的设计.在加载过程中遇见了一些问题,在这里进行一些记载和讨论.如有不同意见欢迎进行评论沟通. 问题时候这样的: 在webview的 ...

  6. 在VC中动态加载ODBC的方法

    在使用VC.VB.Delphi等高级语言编写数据库应用程序时,往往需要用户自己在控制面板中配置ODBC数据源.对于一般用户而言,配置ODBC数据源可能是一件比较困难的工作.而且,在实际应用中,用户往往 ...

  7. C#开发奇技淫巧二:根据dll文件加载C++或者Delphi插件

    原文:C#开发奇技淫巧二:根据dll文件加载C++或者Delphi插件 这两天忙着把框架改为支持加载C++和Delphi的插件,来不及更新blog了.      原来的写的框架只支持c#插件,这个好做 ...

  8. Spring中ApplicationContext加载机制和配置初始化

    Spring中ApplicationContext加载机制.        加载器目前有两种选择:ContextLoaderListener和ContextLoaderServlet.        ...

  9. 【第二篇】xLua中lua加载方式

     xLua中lua文件加载方式 1. 直接执行字符串方式 LuaEnv luaenv = new LuaEnv(); luaenv.DoString("CS.UnityEngine.Debu ...

随机推荐

  1. 【leetcode】1171. Remove Zero Sum Consecutive Nodes from Linked List

    题目如下: Given the head of a linked list, we repeatedly delete consecutive sequences of nodes that sum ...

  2. vue面试题专题

    1,v-if和v-show的作用是什么?有什么区别? v-if:        创建---删除,没有元素.切换开销大.适合不频繁切换的情况用. 例子:制作搜索框,导航栏和搜索框重叠的两个框,点击搜索图 ...

  3. sass、less中的scoped属性

    1.scoped 的实现原理 Vue中的Less 中的 scoped 属性的效果主要是通过 PostCss 实现的.代码示例: //编译前 <template> <div class ...

  4. codevs 4064 组合 x

    很久之前发过啦~不过删掉了...再发一下 4064 组合 时间限制: 1 s 空间限制: 256000 KB 题目等级 : 黄金 Gold 题解 查看运行结果 题目描述 Description 组合就 ...

  5. 在命令行运行java代码

    因为尝试将运行结果通过管道命令保存,所以尝试在命令行(不借助lde来运行java代码,结果折腾了半天) 仿照的是eclipse创建文件目录的方式 最终解决方法是: #/bin/bash root_di ...

  6. View 层

    package com.test.mvp.mvpdemo.mvp.v1.view; import android.app.ProgressDialog;import android.os.Bundle ...

  7. mysqladmin processlist; show processlist/status/open tables/engine/variables/table status/columns/grants/index/privileges/innodb status/logs/warnings/////; 结果筛选

    mysqladmin showprocesslist可查看完整sql需要权限. SHOW PROCESSLIST显示哪些线程正在运行.您也可以使用mysqladmin processlist语句得到此 ...

  8. 关于MonoBehaviour的单例通用规则

    长久以来,对于基于MonoBehaviour的单例总是心有梗结,总觉得用得很忐忑,今天,终于有时间思考和总结了下,理清了想通了.代码和注释如下: 其中GameLogic是我们自己的控制游戏生命周期的管 ...

  9. Qualcomm 8X camera过程解析【转】

    本文转载自:http://blog.csdn.net/gabbzang/article/details/19906687 http://www.01yun.com/mobile_development ...

  10. buildroot

    http://buildroot.uclibc.org/downloads/snapshots/buildroot-snapshot.tar.bz2 简介 buildroot是一个Makefiles和 ...