tabconctrol没有click事件,切换page时,调用SelectedIndexChanged事件;

private void tabControl1_SelectedIndexChanged(object sender, System.EventArgs e) 

   switch(this.tabControl1.SelectedIndex) 
   { 
    case 0: 
       MessageBox.Show("tabPage1 is Selected"); 
     break; 
    case 1: 
       MessageBox.Show("tabPage2 is Selected"); 
     break; 
   } 
}

以下摘抄扩展:

http://www.cnblogs.com/wang2650/archive/2011/11/07/2240421.html

在WinForm开 发的过程中,MDI是一种常见的形式。在MDI主窗体打开的子窗体处于活动状态的只有一个,很多时候我们需要在打开的MDI子窗 体中切换。然而.Net的框架并没有提供一种易见的切换方式,当然可以通过“Ctrl+Tab”来切换,但是这种方式是不易见的,并且只能按照打开窗体的 顺序来切换。

下面来介绍一种结合了TabCotrol控件的软件设计形式。

这种设计形式要解决三个问题:

(1)TabControl的TabPage要和窗体对应

(2)TabControl的TabPage切换的时候,对应的窗体要激活

(3)窗体的新建或关闭,对应的TabPage要创建或撤销

下面就来一步步的解决这些问题

首先拖一个TabControl控件到MDI主窗口中,设置其DOCK为Bottom或者TOP,根据需要也可以设置到左或右。设置其Height为0。主窗体添加如下代码:

//切换TabPage,将对应的窗体激活
        private void tabControl_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (this.MdiChildren.Length > 0)
            {
                for (int i = 0; i < this.MdiChildren.Length; i++)
                {
                    if (this.tabControl.SelectedIndex == i)
                    {
                        this.MdiChildren[i].Activate();
                        return;
                    }
                }
            }
        }

or

//切换TabPage,将对应的窗体激活
        private void tabControl_SelectedIndexChanged(object sender, EventArgs e)
        {
            this.ChangeTabPage();
        }

//子窗体切换激活
        private void ChangeTabPage()
        {
            if (this.MdiChildren.Length > 0 && tabControl.SelectedIndex > -1)
            {
                for (int i = 0; i < this.MdiChildren.Length; i++)
                {
                    if (this.tabControl.SelectedIndex == i)
                    {
                        this.MdiChildren[i].WindowState = FormWindowState.Maximized;
                        this.MdiChildren[i].Visible = true;
                        this.MdiChildren[i].Activate();

}
                    else if (this.MdiChildren[i].Visible == true)
                    {
                        this.MdiChildren[i].Visible = false;
                    }
                }
            }

}
        //增加TabPage,将对应的窗体激活
        private void tabControl_ControlAdded(object sender, ControlEventArgs e)
        {
            if (this.tabControl.SelectedIndex == 0)
            this.ChangeTabPage();
        }

//关闭TabPage,将对应的窗体关闭
        private void tabControl_ControlRemoved(object sender, ControlEventArgs e)
        {
            //if (this.tabControl.SelectedIndex == 0)
                //this.ChangeTabPage();
        }

//窗体关闭的时候,撤销对应的TabPage
        public void RemoveTabPage(TabPage tb)
        {
            this.MultiPageControl.TabPages.Remove(tb);
            if (this.tabControl.TabPages.Count == 0)
            {
                this.TabControlSize = new Size(this.TabControlSize.Width, 0);
            }
        }

//窗体创建的时候,创建对应的TabPage
        public void AddTabPage(TabPage tb)
        {
            if (this.tabControl.TabPages.Count == 0)
            {
                this.TabControlSize = new Size(this.TabControlSize.Width, 20);
            }
            this.MultiPageControl.TabPages.Add(tb);
            this.MultiPageControl.SelectedTab = tb;
        }

//获取TabControl控件,以便子窗体调用(只读)
        public TabControl MultiPageControl
        {
            get
            {
                return this.tabControl;
            }
        }

//获取TabControl控件的Size属性,以便子窗体调用

public Size TabControlSize
        {
            get
            {
                return this.tabControl.Size;
            }
            set
            {
                this.tabControl.Size = value;
            }
        }

对应子窗体,每个窗体打开的时候,主窗体都需要创建一个TabPage,关闭的时候,都要撤销一个TabPage,也就是说所有的子窗体都有共同的属性和功能,所以我设置了一个父窗体来实现这些功能,子窗体通过继承而拥有这些功能。

private frmMain frMain = null;
        private TabPage tabPage = new TabPage();

private void frmTabMain_ParentChanged(object sender, EventArgs e)
        {
            if (this.MdiParent != null)
            {

this.tabPage.Text = this.Text + "  ";
                frMain = this.MdiParent as frmMain;//获取主窗体
                frMain.AddTabPage(tabPage);//调用主窗体方法,创建一个TabPage
            }
        }

//窗体被激活,对应的TabPage也呈选中状态

private void frmTabMain_Enter(object sender, EventArgs e)
        {
            if (this.frMain != null)
            {
                for (int i = 0; i < this.frMain.MdiChildren.Length; i++)
                {
                    if (this.frMain.MdiChildren[i] == this)
                    {
                        this.frMain.MultiPageControl.SelectedIndex = i;
                    }
                }
            }
        }

//窗体关闭,调用主窗体方法,撤销对应TabPage
        private void frmTabTitleMain_FormClosed(object sender, FormClosedEventArgs e)
        {

this.Dispose();

this.frMain.RemoveTabPage(tabPage);
        }

//窗体加载的时候,将窗体的标题赋给对应的TabPage

private void frmTabMain_Load(object sender, EventArgs e)
        {
           // this.tabPage.Text = this.Text;
        }

C# tabconctrol切换事件的更多相关文章

  1. select2切换事件如何生效

    1.问题背景 利用select2生成可搜索下拉框,并且绑定切换事件:但是直接绑定change事件,发现不起作用 2.问题原因 <!DOCTYPE html> <html> &l ...

  2. JS -判断、监听屏幕横竖屏切换事件

    通过监听window.orientationchange事件,当横竖屏切换事件时触发 <!doctype html> <html> <head> <title ...

  3. 小程序的tab切换事件

    index.wxml代码 <view class="tab-left" > <view " bindtap="tab">tab ...

  4. Windows 8 应用程序前后台切换事件监听

    在一些情况下,我们需要监听应用程序切换到后台或者从后台切换至前台的事件,从而进行相关处理操作.支付宝应用锁屏(IOS,Android平台)的处理中就需要监听此事件,在用户将应用切换至后台一段时间后再切 ...

  5. 封装tab切换事件

    HTML <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <titl ...

  6. html tab页面切换事件。

    $(document).bind("visibilitychange",function(e){ //只对tab页面切换有效 //document.visibilityState ...

  7. iOS监听tableView组头切换事件

    - (void)tableView:(UITableView *)tableView willDisplayHeaderView:(UIView *)view forSection:(NSIntege ...

  8. jQuery切换事件

    有html页面内容如下: <body> <h5 id="hh">关于jQuery的介绍</h5> <p id="p1" ...

  9. REDIS主从频繁切换事件排查

    目录 前言 现象 排查 结论 redis主从配置注意点 前言 目前生产配置了2台redis一主一从1.193和12.6,和3个哨兵.1.193,3.10,12.6,搭建的redis高可用环境.突然发生 ...

随机推荐

  1. pptp记录日志

    /etc/ppp/ip-up #!/bin/bash # This file should not be modified -- make local changes to # /etc/ppp/ip ...

  2. Oracle EBS R12 电子技术参考手册 - eTRM (电子文档)

    http://etrm.oracle.com/pls/etrm/etrm_search.search

  3. Timer的用法

    目的实现一个间隔轮询执行的功能. 从网上看到java中可以使用Timer,于是本篇文件就对自己的使用记录,进行一次记录. 主函数: package cn.test.timer; import java ...

  4. MVC中的JS和CSS压缩

    小说一下Js和CSS压缩的好处: 1.减小了文件的体积 2.减小了网络传输量和带宽占用 3.减小了服务器的处理的压力 4.提高了页面的渲染显示的速度  很多建议将站点的静态文件(如图片.js.css ...

  5. 将Cocos2dX渲染到MFC窗口上

    引用:http://www.cnblogs.com/windeer/archive/2012/11/18/2767750.html 引言 现在智能手机已经慢慢进入大众化,移动类应用开始火爆起来,游戏类 ...

  6. 在linux中安装adb和fastboot工具

    我用的是archlinux,在官方的软件仓库里就可以找到对应的包,包的名字叫:android-tools 据说debian系列的软件包是两个,分别是:android-tools-adb, androi ...

  7. c3p0数据库连接池使用

  8. 161214、oracle查询表信息

    1.查找表的所有索引(包括索引名,类型,构成列): select t.*,i.index_type from user_ind_columns t,user_indexes i where t.ind ...

  9. Python—装饰器

    装饰器 1.普通函数 #简单的函数和调用 def a1(): print("i am zhangsan") def a2(): print("i am lisi" ...

  10. 一步一步教你编写与搭建自动化测试框架——python篇

    [本文出自天外归云的博客园] 这两天用python写了一个自动化测试框架,取名为Auty.准备用来做Web方面的接口测试,以下为Auty框架一步一步的搭建过程——