zoukankan      html  css  js  c++  java
  • WinForm中TabControl的一些事件写法(C#)

    在TabControl控件中并没提供单个选项卡的Click事件,今天下午翻了翻MSDN 结果还是没找到相关的文档:( 看来只有自个儿折腾了...
    还好有个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;
       }
    }

    在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;
            }



    作者:过错
    出处:http://www.cnblogs.com/wang2650/
    关于作者:net开发做的久而已。十余年时光虚度!
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。如有问题,可以邮件:wang2650@163.com  联系我,非常感谢。

  • 相关阅读:
    Kibana安装
    elasticsearch安装
    分布式_zookeeper
    通信协议_三次握手_四次挥手
    Spring中的IOC_源码_随笔
    Spring设计模式_策略模式/其他
    Spring设计模式_工厂模式
    spring设计模式_代理模式
    docker常用指令01
    ubuntu18下安装docker
  • 原文地址:https://www.cnblogs.com/wang2650/p/2240421.html
Copyright © 2011-2022 走看看