`
baobeituping
  • 浏览: 1064839 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

WinForm中TabControl的一些事件写法(C#)

    博客分类:
  • .NET
 
阅读更多

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

 

 

--------------------------------------------------------------------------------------------------------------

本页面实现功能为:点击左侧边栏的菜单 页面部分TabControl自动添加所对应的页面
        /// </summary>
        /// <param name="MainTabControlKey">选项卡的键值</param>
        /// <param name="objTabControl">要添加到的TabControl对象</param>
        /// <returns></returns>
        private Boolean ErgodicModiForm(string MainTabControlKey, TabControl objTabControl)
        {
            //遍历选项卡判断是否存在该子窗体
            foreach (Control con in objTabControl.Controls)
            {
                tbPage = (TabPage)con;
                if (tbPage.Name == MainTabControlKey)
                {
                    return false;//存在
                }
            }
            return true;//不存在
        }

        private TabPage tbPage = null;
        /// <summary>
        /// 添加选项卡页面显示窗体信息
        /// </summary>
        /// <param name="id">选项卡id</param>
        /// <param name="name">选项卡名称</param>
        /// <param name="newForm">所要加载的窗体</param>
        private void AddTab(string id, string name, Form newForm)
        {
            if (ErgodicModiForm(id, tbcMain))
            {
                tbPage = new TabPage();
                tbPage.Name = id;
                tbPage.Text = name;
                tbcMain.TabPages.Add(tbPage);
                tbcMain.BackColor = Color.FromName("#3775B2");
                //newForm.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right |

AnchorStyles.Bottom;
                newForm.Dock = DockStyle.Fill;
                newForm.BackColor = ColorTranslator.FromHtml("#e3f1fe"); 
                newForm.FormBorderStyle = FormBorderStyle.None;
                newForm.TopLevel = false;

                //添加右键菜单
                contextMenu = new ContextMenuStrip(this.components);
                //contextMenu.TopLevel = false;
                contextMenu.Items.Add("关闭窗口");
                //this.Controls.Add(contextMenu);
                contextMenu.Items[0].Click += new System.EventHandler(this.contextMenuItem_Click);

                newForm.Show();
                tbPage.Controls.Add(newForm);
                newForm.ContextMenuStrip = contextMenu;  //指定窗体的右键菜单                
            }
            tbcMain.SelectedTabPage = tbPage;
        }

        /// <summary>
        /// 右键菜单单击关闭窗体,关闭当前选项卡页面
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void contextMenuItem_Click(object sender, EventArgs e)
        {
            foreach (Control i in this.tbcMain.SelectedTab.Controls)
            {
                if (i.GetType() == typeof(Form))
                {
                    Form form = (Form)i;
                    form.Close();
                }
            }
            this.tbcMain.TabPages.RemoveAt(this.tbcMain.SelectedIndex);
        }

        /// <summary>
        /// 点击操作员管理菜单,加载操作员管理页面
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void tsmiOperManage_Click(object sender, EventArgs e)
        {
            User_Mange userMange=new User_Mange();
            AddTab("OperManage","操作员管理",userMange);
        }

分享到:
评论

相关推荐

    c# winform美化TabControl的一些代码

    在C# WinForm开发中,TabControl是一个常用的控件,它用于展示多个窗口或面板,让用户在不同的内容间切换。然而,系统默认的TabControl样式相对朴素,对于追求用户体验和界面美观的应用来说,可能需要进行一些定制化...

    C# Winform 美化TabControl

    在C# WinForm开发中,TabControl是一个常用的控件,它允许用户通过不同的选项卡来组织和切换内容。然而,标准的TabControl在外观上可能显得较为简单,无法满足一些追求美观和个性化界面的需求。本篇文章将深入探讨...

    C# winform TabControl 自定义标签颜色 点击突出显示

    在C# WinForm开发中,TabControl是一个常用的控件,它允许用户通过标签页来组织和切换不同的内容区域。然而,Windows默认的TabControl样式可能无法满足所有设计需求,特别是在需要个性化或者增强用户体验时。本篇...

    C# Winform TabControl选项卡 动态添加,删除,修改

    在C# WinForm开发中,TabControl控件是一个非常常用且实用的组件,它允许我们将多个窗体或界面组织在一个统一的界面下,每个Tab页代表一个独立的功能区域。本教程将详细讲解如何实现TabControl的动态添加、删除和...

    winform tabcontrol 美化控件

    在Windows Forms(WinForm)开发中,`TabControl`是一个常用控件,用于展示多个页面或面板,每个页面或面板可以通过标签进行切换。然而,系统默认的`TabControl`样式较为简单,有时不能满足开发者对界面美观性的需求...

    控件重绘 C# WinForm控件美化扩展系列之TabControl

    "控件重绘 C# WinForm控件美化扩展系列之TabControl"可能还包括了一些示例代码,如在压缩包中的两个RAR文件。通过学习和分析这些代码,开发者可以深入理解控件重绘的过程,并应用于自己的项目中,实现个性化和专业化...

    自定义Winform控件TabControl,可同时存在左右tabpage

    在标题“自定义Winform控件TabControl,可同时存在左右tabpage”中,我们讨论的是一个经过定制的TabControl控件,它扩展了这一功能,使得标签页可以同时出现在左侧和右侧,为用户界面设计提供了更多灵活性。...

    C# WinForm控件美化扩展系列之TabControl(续)

    C# WinForm控件美化扩展系列之TabControl(续).rar C# WinForm控件美化扩展系列之TabControl(续).rar C# WinForm控件美化扩展系列之TabControl(续).rar

    C#TabControl重写(添加关闭与添加按钮)

    C#,Winform TabControl重写(添加关闭与添加按钮鼠标移动变色功能),可自定义添加按钮及样式

    C#窗体TabControl控件美化版源代码

    在C#编程中,TabControl控件是Windows Forms应用程序中常用的一种组件,用于展示多个相关的页面或窗体。这个“C#窗体TabControl控件美化版源代码”显然提供了一个定制的实现,它增强了标准TabControl控件的外观和...

    Winform TabControl动态创建并实现GridView拖拽显示

    在Windows Forms(Winform)开发中,TabControl是一个常用的控件,它允许用户通过标签页的形式展示多个相关的界面或数据。本教程将详细讲解如何在Winform应用中动态创建TabControl,并结合GridView实现数据的拖拽...

    C# TabControl改变标题样式

    在C#中,我们通常会通过操作TabControl和TabPage的属性,或者自定义绘制(DrawItem事件)来实现样式更改。 1. **修改字体**:默认情况下,TabControl的字体是由系统的默认设置决定的。要改变字体,我们需要分别设置...

    C# TabConTrol控件背景颜色问题

    通过上述知识点,我们可以了解到在C# WinForm开发中,如何通过设置DrawMode属性、注册并处理DrawItem事件以及通过GDI+图形对象来实现TabControl控件背景颜色的自定义,从而达到界面美化的需要。

    C#TabControl添加关闭功能

    在C#编程中,TabControl控件是Windows Forms应用程序中常用的一种组件,用于展示多个标签页,每个标签页可以承载不同的内容。在某些情况下,我们可能需要为TabControl添加一个关闭功能,让用户能够根据需要关闭特定...

    winform用tabcontrol切换mdi子窗口及为tabcontrol的page添加关闭按钮

    在Windows Forms(WinForm)开发中,`TabControl`控件是一个非常实用的组件,它可以用于组织和展示多个用户界面(UI)元素在一个统一的视图中。本篇将详细讲解如何利用`TabControl`来实现子窗口的切换,并为每个...

    C# winform 分屏 动态生成tabControl窗体

    在C# WinForm开发中,有时我们需要创建一个用户界面,其中可以显示多个并行的视图或工作区,这时TabControl控件就派上用场了。TabControl允许我们在一个容器中组织多个窗体或者控件,每个标签页代表一个独立的工作...

    C#tabcontrol中标签居左显示重绘代码

    C#TabControl 中标签居左显示重绘代码详解 在 C# 开发中,使用 TabControl 控件时,通常标签会默认居中或居右显示,而在某些情况下,我们需要将标签显示在左侧,以便于用户更好地浏览和操作。以下将详细介绍如何在 ...

    框架window窗体嵌套在tabControl中

    在C#中,TabControl允许你添加、删除和操作TabPages,方便地组织和展示各种内容。 2. Window窗体: Window是.NET Framework中的一个类,通常用于创建独立的应用程序窗口。在WPF中,它是Window类;而在Windows Forms...

    自定义Tabpage控件,tabcontrol控件,很漂亮哦,C#源代码

    在C#中,TabControl控件是System.Windows.Forms命名空间的一部分,它默认提供了基本的标签页功能。然而,开发者往往需要对其进行自定义以满足特定的界面需求,比如改变标签页的样式、添加动画效果或者增强交互性。...

    C# winform 单击与双击事件同时存在例子

    在C# WinForm开发中,用户界面交互是一个关键部分,其中单击(Click)和双击(DoubleClick)事件是常见的用户输入响应。然而,标题提到的一个常见问题是:在同一个控件上,C# WinForm不支持同时处理单击和双击事件。...

Global site tag (gtag.js) - Google Analytics