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

 

 

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

本頁面實現功能爲:點擊左側邊欄的菜單 頁面部分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);
        }

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章