ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • C# 윈폼 Final Project 탭컨트롤 다루기
    C# 2020. 9. 18. 15:13

    트리뷰를 누르면 새로운 탭 생성 & 폼 불러오기 (만약 이미 불러온 폼이라면 해당 탭인덱스로 이동)

     

    Commons 라는 공용 클래스에 

    public static Dictionary<string, int> DICT_REMOVE_INDEX = new Dictionary<string, int>();

     

    Dictionary <"탭페이지 헤더텍스트" , 생성되는 탭 인덱스> 를 저장 시켜놓고 조건문으로 생성하려는 탭페이지 헤더텍스트가 딕셔너리 내부에 있으면 키를 통해 인덱스로 접근, 그 외에는 새로운 탭 페이지 생성과 동시에 그안에 폼을 띄운다.

     
     private void treeView1_NodeMouseDoubleClick(object sender, TreeNodeMouseClickEventArgs e)
            {
                string str = (e.Node.ToString()).Substring(10);
                //공장코드관리
    
                switch (str)
                {
                    case "공장코드관리": //탭이 겹치면 그 탭을 열고 겹치는 탭이 없으면 새로운 탭 생성
                        if (!Commons.DICT_REMOVE_INDEX.ContainsKey(str))
                        {
                            M020_002 form = new M020_002();
                            form.FormCloseEvent += DeleteTabpage;
                            form.TopLevel = false;
                            tabControl1.TabPages.Add(str);
                            tabControl1.TabPages[tabControl1.TabPages.Count - 1].Controls.Add(form);
                            tabControl1.SelectedIndex = tabControl1.TabPages.Count - 1;
                            tabControl1.TabPages[tabControl1.TabPages.Count - 1].Controls.Add(form);
    
                            Commons.DICT_REMOVE_INDEX.Add(str,tabControl1.SelectedIndex); //Dictionary로 화면텍스트와 탭번호 저장
                            form.Dock = DockStyle.Fill;
                            form.Show();
                        }
                        else
                        {
                            tabControl1.SelectedTab = tabControl1.TabPages[Commons.DICT_REMOVE_INDEX[str]];
                        }
                        break;
                    case "회사코드관리":
                        if (!Commons.DICT_REMOVE_INDEX.ContainsKey(str))
                        {
                            M020_001 form = new M020_001();
                            form.FormCloseEvent += DeleteTabpage;
                            form.TopLevel = false;
                            tabControl1.TabPages.Add(str);
                            tabControl1.TabPages[tabControl1.TabPages.Count - 1].Controls.Add(form);
                            tabControl1.SelectedIndex = tabControl1.TabPages.Count - 1;
                            tabControl1.TabPages[tabControl1.TabPages.Count - 1].Controls.Add(form);
    
                            Commons.DICT_REMOVE_INDEX.Add(str, tabControl1.SelectedIndex);
    
                            form.Dock = DockStyle.Fill;
                            form.Show();
                            
                        }
                        else
                        {
                            tabControl1.SelectedTab = tabControl1.TabPages[Commons.DICT_REMOVE_INDEX[str]];
                        }
                        break;
                    case "사용자정보":
                        if (!Commons.DICT_REMOVE_INDEX.ContainsKey(str))
                        {
                            M020_003 form = new M020_003();
                            form.FormCloseEvent += DeleteTabpage;
                            form.TopLevel = false;
                            tabControl1.TabPages.Add(str);
                            tabControl1.TabPages[tabControl1.TabPages.Count - 1].Controls.Add(form);
                            tabControl1.SelectedIndex = tabControl1.TabPages.Count - 1;
                            tabControl1.TabPages[tabControl1.TabPages.Count - 1].Controls.Add(form);
    
                            Commons.DICT_REMOVE_INDEX.Add(str, tabControl1.SelectedIndex);
    
                            form.Dock = DockStyle.Fill;
                            form.Show();
                        }
                        else
                        {
                            tabControl1.SelectedTab = tabControl1.TabPages[Commons.DICT_REMOVE_INDEX[str]];
                        }
                        break;
                   }
            }

     

     

    탭페이지 헤더 옆에 탭페이지 삭제 버튼 구현

     

    윈폼의 탭컨트롤은 탭헤더에 닫기 버튼을 지원하지 않는다. 따라서 DrawItem으로 그려주고 해당 위치 내에 마우스클릭 이벤트를 넣어서 닫기 기능을 구현해줘야 한다.

    using Draw = System.Drawing;
    
    
     private Draw.Point _imageLocation = new Draw.Point(15, 5);
     private Draw.Point _imgHitArea = new Draw.Point(13, 2);
      //탭컨트롤에 닫기 버튼 추가
            private void tabControl1_DrawItem(object sender, DrawItemEventArgs e)
            {
                try
                {
                    Draw.Image img;
    
                    Draw.Font f = this.Font;
    
                    Draw.Rectangle r = e.Bounds;
                    Draw.Brush titleBrush = new Draw.SolidBrush(Draw.Color.Black);
                    string title = this.tabControl1.TabPages[e.Index].Text;
    
    
    
                    r = this.tabControl1.GetTabRect(e.Index);
                    r.Offset(2, 2);
    
    
    
                    // SelectedTab의 Background Color 는 White으로 처리
                    if (this.tabControl1.SelectedIndex == e.Index)
                        e.Graphics.FillRectangle(new Draw.SolidBrush(Draw.Color.White), e.Bounds);
    
    
                    // 각 Tab별로 close button 에 대한 image값 
                    if (this.tabControl1.SelectedTab == this.tabControl1.TabPages[e.Index])
                        img = Properties.Resources.Cancel2;
                    else
                        img = Properties.Resources.Cancel2;
    
                    // TabPage Text
                    e.Graphics.DrawString(title+ " ", f, titleBrush, new Draw.PointF(r.X, r.Y));
    
    
                    // TabPage 의 닫기 버튼
                    e.Graphics.DrawImage(img, new Draw.Point(r.X + this.tabControl1.GetTabRect(e.Index).Width - _imageLocation.X, _imageLocation.Y));
    
                    img.Dispose();
                    img = null;
                }
    
    
                catch (Exception)
                {
                }
               
            }
    
        }

    닫기 버튼의 범위를 정의해주고 해당 위치 내에 마우스의 위치가 겹친 곳을 클릭하게 되면 닫기 버튼이 기능하게 한다.

    닫기 할 때 Dictionary로 정의 해놓은 탭페이지 중에서 닫기 버튼을 누른 탭페이지가 딕셔너리에서 제거되야 하고, 그 뒤에 있는 탭페이지들은 딕셔너리의 Value에 넣어놓은 탭인덱스를 한칸씩 땡겨야 한다. 

    //탭컨트롤에서 탭에 그린 닫기버튼내부의 영역을 클릭하면 폼 닫기
            private void tabControl1_MouseClick(object sender, MouseEventArgs e)
            {
                
                TabControl tc = (TabControl)sender;
                tabindex = tc.SelectedIndex;
                Draw.Point p = e.Location;
                int _tabWidth = 0;
                _tabWidth = this.tabControl1.GetTabRect(tc.SelectedIndex).Width - (_imgHitArea.X);
                Draw.Rectangle r = this.tabControl1.GetTabRect(tc.SelectedIndex);
                r.Offset(_tabWidth, _imgHitArea.Y);
                r.Width = 16;
                r.Height = 16;
                if (r.Contains(p))
                {
                    TabPage TabP = (TabPage)tc.TabPages[tc.SelectedIndex];
                    tc.TabPages.Remove(TabP);
    
    
    
                    //MessageBox.Show(TabP.Text);
                    int index = Commons.DICT_REMOVE_INDEX[TabP.Text];
                    Commons.DICT_REMOVE_INDEX.Remove(TabP.Text);
    
                    //탭페이지를 앞으로 한칸씩땡긴다.
                    for (int i = index; i < Commons.DICT_REMOVE_INDEX.Count; i++)
                    {
                        string tempstring = Commons.DICT_REMOVE_INDEX.FirstOrDefault(x => x.Value == i + 1).Key;
                        int tempint = Commons.DICT_REMOVE_INDEX[tempstring];
                        Commons.DICT_REMOVE_INDEX.Remove(tempstring);
                        Commons.DICT_REMOVE_INDEX.Add(tempstring, tempint - 1);
                    }
                }
            }

     

    탭페이지 안의 폼이 닫힐때 탭페이지 삭제하기

    델리게이트를 사용한다. 탭페이지를 새로 생성하면서 폼도 그안에 생성시키는데 폼안에 새로운 메서드를 정의해야 한다.

    public delegate void FormClosed(string str);
            public event FormClosed FormCloseEvent;
            private void btn_Exit_Click(object sender, EventArgs e)
            {
                this.FormCloseEvent("공장코드관리");
                this.Close();
    
            }

    폼안의 닫기 버튼을 누를 때 델리게이트로 정의해놓은 FormClosed메서드로 문자열을 탭페이지가 있는 폼으로 보낸다.

    private void DeleteTabpage(string temp)
            {
                int aint = 0;
                for (int i = 0; i < tabControl1.TabPages.Count; i++)
                {
                    if(tabControl1.TabPages[i].Text==temp)
                    {
                        aint = i;
                    }
                }
                tabControl1.TabPages.RemoveAt(aint);
    
                int index = Commons.DICT_REMOVE_INDEX[temp];
                
                Commons.DICT_REMOVE_INDEX.Remove(temp);
    
                //탭페이지를 앞으로 한칸씩땡긴다.
                if (Commons.DICT_REMOVE_INDEX.Count>2)
                {
                    for (int i = index; i < Commons.DICT_REMOVE_INDEX.Count; i++)
                    {
                        string tempstring = Commons.DICT_REMOVE_INDEX.FirstOrDefault(x => x.Value == i + 1).Key;
                        int tempint = Commons.DICT_REMOVE_INDEX[tempstring];
                        Commons.DICT_REMOVE_INDEX.Remove(tempstring);
                        Commons.DICT_REMOVE_INDEX.Add(tempstring, tempint - 1);
                    }
                }
                tabControl1.SelectedIndex = aint - 1;
            }

    닫힌 폼에서 보내온 문자열을 가지고 위 메서드가 실행된다. 닫힌 폼이 공장관리라면 "공장관리" 텍스트로 해당 텍스트를 헤더텍스트로 가지고 있는 텝 페이지의 인덱스를 딕셔너리를 통해서 알아내고 탭페이지를 지운다. 그리고 딕셔너리의 Value를 앞으로 한칸씩 땡긴다.

     

    전체 소스 코드

    using MetroFramework;
    using MetroFramework.Forms;
    using Microsoft.Office.Interop.Excel;
    using MiniProject.사용자;
    using System;
    using System.Data;
    using System.Data.SqlClient;
    using Draw = System.Drawing;
    using System.Linq;
    using System.Windows.Forms;
    using Microsoft.Office.Interop.Excel;
    
    namespace MiniProject
    {
        public partial class MainForm : Form
        {
            private Draw.Point _imageLocation = new Draw.Point(15, 5);
            private Draw.Point _imgHitArea = new Draw.Point(13, 2);
            public MainForm()
            {
                InitializeComponent();
                // set the Mode of Drawing as Owner Drawn
                this.tabControl1.DrawMode = TabDrawMode.OwnerDrawFixed;
                this.tabControl1.ItemSize = new Draw.Size(100, 20);
                this.tabControl1.SizeMode = TabSizeMode.Fixed;
    
                // Add the Handler to draw the Image on Tab Pages
                tabControl1.DrawItem += tabControl1_DrawItem;
            }
            //폼닫을때 메세지
            private void MainForm_FormClosing(object sender, FormClosingEventArgs e)
            {
                if (MetroMessageBox.Show(this, "정말 종료하시겠습니까?", "종료", MessageBoxButtons.OKCancel, MessageBoxIcon.Question) == DialogResult.OK)
                {
                    foreach (var item in this.MdiChildren)
                    {
                        item.Close();
                    }
    
                    e.Cancel = false;
                }
                else
                {
                    e.Cancel = true;
                }
            }
    
            private void MainForm_Load(object sender, EventArgs e)
            {
                Commons.DICT_REMOVE_INDEX.Add("시작화면", 0);
    
            }
            //메뉴와 검색창 열고 닫기
            private void button1_Click(object sender, EventArgs e)
            {
                this.WindowState = FormWindowState.Minimized;
            }
    
    
            private void button1_Click_2(object sender, EventArgs e)
            {
                this.Close();
    
            }
            private void button3_Click(object sender, EventArgs e)
            {
                this.WindowState = FormWindowState.Maximized;
            }
    
            private void button4_Click(object sender, EventArgs e)
            {
                this.WindowState = FormWindowState.Minimized;
            }
    
            //검색기능과 리스트뷰 열고접기
            private void btn_Search_Fold_Click(object sender, EventArgs e)
            {
                Search_Panel.Visible = false;
                btn_Search_Fold.Visible = false;
                btn_Search_Splash.Visible = true;
            }
    
            private void btn_Search_Splash_Click(object sender, EventArgs e)
            {
                Search_Panel.Visible = true;
                btn_Search_Fold.Visible = true;
                btn_Search_Splash.Visible = false;
            }
    
            private void btn_TreeView_Fold_Click(object sender, EventArgs e)
            {
                treeView1.Visible = false;
                btn_TreeView_Fold.Visible = false;
                btn_TreeView_Splash.Visible = true;
            }
    
            private void btn_TreeView_Splash_Click(object sender, EventArgs e)
            {
                treeView1.Visible = true;
                btn_TreeView_Fold.Visible = true;
                btn_TreeView_Splash.Visible = false;
            }
    
            //2020.08.24 검색기능
            private void btn_Node_Search_Click(object sender, EventArgs e)
            {
                for (int i = 0; i < treeView1.Nodes.Count; i++)
                {
                    for (int j = 0; j < treeView1.Nodes[i].Nodes.Count; j++)
                    {
                        for (int k = 0; k < treeView1.Nodes[i].Nodes[j].Nodes.Count; k++)
                        {
                            if (treeView1.Nodes[i].Nodes[j].Nodes[k].Text.Contains(txt_Search.Text))
                            {
                                treeView1.Nodes[i].Nodes[j].Nodes[k].ForeColor = Draw.Color.Red;
                            }
                        }
                    }
                }
    
    
    
            }
            //2020.08.24 검색 새로고침
            private void btn_Search_Refresh_Click(object sender, EventArgs e)
            {
                for (int i = 0; i < treeView1.Nodes.Count; i++)
                {
                    for (int j = 0; j < treeView1.Nodes[i].Nodes.Count; j++)
                    {
                        for (int k = 0; k < treeView1.Nodes[i].Nodes[j].Nodes.Count; k++)
                        {
                            treeView1.Nodes[i].Nodes[j].Nodes[k].ForeColor = Draw.Color.Black;
    
                        }
                    }
                }
            }
            //공장코드관리 열기
            private void treeView1_NodeMouseDoubleClick(object sender, TreeNodeMouseClickEventArgs e)
            {
                string str = (e.Node.ToString()).Substring(10);
                //공장코드관리
    
                switch (str)
                {
                    case "공장코드관리": //탭이 겹치면 그 탭을 열고 겹치는 탭이 없으면 새로운 탭 생성
                        if (!Commons.DICT_REMOVE_INDEX.ContainsKey(str))
                        {
                            M020_002 form = new M020_002();
                            form.FormCloseEvent += DeleteTabpage;
                            form.TopLevel = false;
                            tabControl1.TabPages.Add(str);
                            tabControl1.TabPages[tabControl1.TabPages.Count - 1].Controls.Add(form);
                            tabControl1.SelectedIndex = tabControl1.TabPages.Count - 1;
                            tabControl1.TabPages[tabControl1.TabPages.Count - 1].Controls.Add(form);
    
                            Commons.DICT_REMOVE_INDEX.Add(str,tabControl1.SelectedIndex); //Dictionary로 화면텍스트와 탭번호 저장
                            form.Dock = DockStyle.Fill;
                            form.Show();
                        }
                        else
                        {
                            tabControl1.SelectedTab = tabControl1.TabPages[Commons.DICT_REMOVE_INDEX[str]];
                        }
                        break;
                    case "회사코드관리":
                        if (!Commons.DICT_REMOVE_INDEX.ContainsKey(str))
                        {
                            M020_001 form = new M020_001();
                            form.FormCloseEvent += DeleteTabpage;
                            form.TopLevel = false;
                            tabControl1.TabPages.Add(str);
                            tabControl1.TabPages[tabControl1.TabPages.Count - 1].Controls.Add(form);
                            tabControl1.SelectedIndex = tabControl1.TabPages.Count - 1;
                            tabControl1.TabPages[tabControl1.TabPages.Count - 1].Controls.Add(form);
    
                            Commons.DICT_REMOVE_INDEX.Add(str, tabControl1.SelectedIndex);
    
                            form.Dock = DockStyle.Fill;
                            form.Show();
                            
                        }
                        else
                        {
                            tabControl1.SelectedTab = tabControl1.TabPages[Commons.DICT_REMOVE_INDEX[str]];
                        }
                        break;
                    case "사용자정보":
                        if (!Commons.DICT_REMOVE_INDEX.ContainsKey(str))
                        {
                            M020_003 form = new M020_003();
                            form.FormCloseEvent += DeleteTabpage;
                            form.TopLevel = false;
                            tabControl1.TabPages.Add(str);
                            tabControl1.TabPages[tabControl1.TabPages.Count - 1].Controls.Add(form);
                            tabControl1.SelectedIndex = tabControl1.TabPages.Count - 1;
                            tabControl1.TabPages[tabControl1.TabPages.Count - 1].Controls.Add(form);
    
                            Commons.DICT_REMOVE_INDEX.Add(str, tabControl1.SelectedIndex);
    
                            form.Dock = DockStyle.Fill;
                            form.Show();
                        }
                        else
                        {
                            tabControl1.SelectedTab = tabControl1.TabPages[Commons.DICT_REMOVE_INDEX[str]];
                        }
                        break;
                    //case "작업장관리": //탭이 겹치면 그 탭을 열고 겹치는 탭이 없으면 새로운 탭 생성
                    //    if (!Commons.DICT_REMOVE_INDEX.ContainsKey(str))
                    //    {
                    //        M020_004 form = new M020_004();
                    //        form.FormCloseEvent += DeleteTabpage;
                    //        form.TopLevel = false;
                    //        tabControl1.TabPages.Add(str);
                    //        tabControl1.TabPages[tabControl1.TabPages.Count - 1].Controls.Add(form);
                    //        tabControl1.SelectedIndex = tabControl1.TabPages.Count - 1;
                    //        tabControl1.TabPages[tabControl1.TabPages.Count - 1].Controls.Add(form);
    
                    //        Commons.DICT_REMOVE_INDEX.Add(str, tabControl1.SelectedIndex); //Dictionary로 화면텍스트와 탭번호 저장
                    //        form.Dock = DockStyle.Fill;
                    //        form.Show();
                    //    }
                    //    else
                    //    {
                    //        tabControl1.SelectedTab = tabControl1.TabPages[Commons.DICT_REMOVE_INDEX[str]];
                    //    }
                    //    break;
                    case "협력사정보":
                        if (!Commons.DICT_REMOVE_INDEX.ContainsKey(str))
                        {
                            M020_012 form = new M020_012();
                            form.FormCloseEvent += DeleteTabpage;
                            form.TopLevel = false;
                            tabControl1.TabPages.Add(str);
                            tabControl1.TabPages[tabControl1.TabPages.Count - 1].Controls.Add(form);
                            tabControl1.SelectedIndex = tabControl1.TabPages.Count - 1;
                            tabControl1.TabPages[tabControl1.TabPages.Count - 1].Controls.Add(form);
    
                            Commons.DICT_REMOVE_INDEX.Add(str, tabControl1.SelectedIndex);
    
                            form.Dock = DockStyle.Fill;
                            form.Show();
                        }
                        else
                        {
                            tabControl1.SelectedTab = tabControl1.TabPages[Commons.DICT_REMOVE_INDEX[str]];
                        }
                        break;
                    case "불량정보":
                        if (!Commons.DICT_REMOVE_INDEX.ContainsKey(str))
                        {
                            M020_010 form = new M020_010();
                            form.FormCloseEvent += DeleteTabpage;
                            form.TopLevel = false;
                            tabControl1.TabPages.Add(str);
                            tabControl1.TabPages[tabControl1.TabPages.Count - 1].Controls.Add(form);
                            tabControl1.SelectedIndex = tabControl1.TabPages.Count - 1;
                            tabControl1.TabPages[tabControl1.TabPages.Count - 1].Controls.Add(form);
    
                            Commons.DICT_REMOVE_INDEX.Add(str, tabControl1.SelectedIndex);
    
                            form.Dock = DockStyle.Fill;
                            form.Show();
                        }
                        else
                        {
                            tabControl1.SelectedTab = tabControl1.TabPages[Commons.DICT_REMOVE_INDEX[str]];
                        }
                        break;
                    case "BOM정보":
                        if (!Commons.DICT_REMOVE_INDEX.ContainsKey(str))
                        {
                            M020_006 form = new M020_006();
                            form.FormCloseEvent += DeleteTabpage;
                            form.TopLevel = false;
                            tabControl1.TabPages.Add(str);
                            tabControl1.TabPages[tabControl1.TabPages.Count - 1].Controls.Add(form);
                            tabControl1.SelectedIndex = tabControl1.TabPages.Count - 1;
                            tabControl1.TabPages[tabControl1.TabPages.Count - 1].Controls.Add(form);
    
                            Commons.DICT_REMOVE_INDEX.Add(str, tabControl1.SelectedIndex);
    
                            form.Dock = DockStyle.Fill;
                            form.Show();
                        }
                        else
                        {
                            tabControl1.SelectedTab = tabControl1.TabPages[Commons.DICT_REMOVE_INDEX[str]];
                        }
                        break;
                    case "공정관리":
                        if (!Commons.DICT_REMOVE_INDEX.ContainsKey(str))
                        {
                            M020_005 form = new M020_005();
                            form.FormCloseEvent += DeleteTabpage;
                            form.TopLevel = false;
                            tabControl1.TabPages.Add(str);
                            tabControl1.TabPages[tabControl1.TabPages.Count - 1].Controls.Add(form);
                            tabControl1.SelectedIndex = tabControl1.TabPages.Count - 1;
                            tabControl1.TabPages[tabControl1.TabPages.Count - 1].Controls.Add(form);
    
                            Commons.DICT_REMOVE_INDEX.Add(str, tabControl1.SelectedIndex);
    
                            form.Dock = DockStyle.Fill;
                            form.Show();
                        }
                        else
                        {
                            tabControl1.SelectedTab = tabControl1.TabPages[Commons.DICT_REMOVE_INDEX[str]];
                        }
                        break;
                    case "자재정보":
                        if (!Commons.DICT_REMOVE_INDEX.ContainsKey(str))
                        {
                            M020_014 form = new M020_014();
                            form.FormCloseEvent += DeleteTabpage;
                            form.TopLevel = false;
                            tabControl1.TabPages.Add(str);
                            tabControl1.TabPages[tabControl1.TabPages.Count - 1].Controls.Add(form);
                            tabControl1.SelectedIndex = tabControl1.TabPages.Count - 1;
                            tabControl1.TabPages[tabControl1.TabPages.Count - 1].Controls.Add(form);
    
                            Commons.DICT_REMOVE_INDEX.Add(str, tabControl1.SelectedIndex);
    
                            form.Dock = DockStyle.Fill;
                            form.Show();
                        }
                        else
                        {
                            tabControl1.SelectedTab = tabControl1.TabPages[Commons.DICT_REMOVE_INDEX[str]];
                        }
                        break;
                    case "자재주문요청":
                        if (!Commons.DICT_REMOVE_INDEX.ContainsKey(str))
                        {
                            M030_001 form = new M030_001();
                            form.FormCloseEvent += DeleteTabpage;
                            form.TopLevel = false;
                            tabControl1.TabPages.Add(str);
                            tabControl1.TabPages[tabControl1.TabPages.Count - 1].Controls.Add(form);
                            tabControl1.SelectedIndex = tabControl1.TabPages.Count - 1;
                            tabControl1.TabPages[tabControl1.TabPages.Count - 1].Controls.Add(form);
    
                            Commons.DICT_REMOVE_INDEX.Add(str, tabControl1.SelectedIndex);
    
                            form.Dock = DockStyle.Fill;
                            form.Show();
    
                        }
                        else
                        {
                            tabControl1.SelectedTab = tabControl1.TabPages[Commons.DICT_REMOVE_INDEX[str]];
                        }
                        break;
                    case "작업장관리":
                        if (!Commons.DICT_REMOVE_INDEX.ContainsKey(str))
                        {
                            M020_004 form = new M020_004();
                            form.FormCloseEvent += DeleteTabpage;
                            form.TopLevel = false;
                            tabControl1.TabPages.Add(str);
                            tabControl1.TabPages[tabControl1.TabPages.Count - 1].Controls.Add(form);
                            tabControl1.SelectedIndex = tabControl1.TabPages.Count - 1;
                            tabControl1.TabPages[tabControl1.TabPages.Count - 1].Controls.Add(form);
    
                            Commons.DICT_REMOVE_INDEX.Add(str, tabControl1.SelectedIndex);
    
                            form.Dock = DockStyle.Fill;
                            form.Show();
    
                        }
                        else
                        {
                            tabControl1.SelectedTab = tabControl1.TabPages[Commons.DICT_REMOVE_INDEX[str]];
                        }
                        break;
                    case "설비정보":
                        if (!Commons.DICT_REMOVE_INDEX.ContainsKey(str))
                        {
                            M020_008 form = new M020_008();
                            form.FormCloseEvent += DeleteTabpage;
                            form.TopLevel = false;
                            tabControl1.TabPages.Add(str);
                            tabControl1.TabPages[tabControl1.TabPages.Count - 1].Controls.Add(form);
                            tabControl1.SelectedIndex = tabControl1.TabPages.Count - 1;
                            tabControl1.TabPages[tabControl1.TabPages.Count - 1].Controls.Add(form);
    
                            Commons.DICT_REMOVE_INDEX.Add(str, tabControl1.SelectedIndex);
    
                            form.Dock = DockStyle.Fill;
                            form.Show();
    
                        }
                        else
                        {
                            tabControl1.SelectedTab = tabControl1.TabPages[Commons.DICT_REMOVE_INDEX[str]];
                        }
                        break;
                    case "제품정보":
                        if (!Commons.DICT_REMOVE_INDEX.ContainsKey(str))
                        {
                            M020_011 form = new M020_011();
                            form.FormCloseEvent += DeleteTabpage;
                            form.TopLevel = false;
                            tabControl1.TabPages.Add(str);
                            tabControl1.TabPages[tabControl1.TabPages.Count - 1].Controls.Add(form);
                            tabControl1.SelectedIndex = tabControl1.TabPages.Count - 1;
                            tabControl1.TabPages[tabControl1.TabPages.Count - 1].Controls.Add(form);
    
                            Commons.DICT_REMOVE_INDEX.Add(str, tabControl1.SelectedIndex);
    
                            form.Dock = DockStyle.Fill;
                            form.Show();
    
                        }
                        else
                        {
                            tabControl1.SelectedTab = tabControl1.TabPages[Commons.DICT_REMOVE_INDEX[str]];
                        }
                        break;
                    case "자재주문승인":
                        if (!Commons.DICT_REMOVE_INDEX.ContainsKey(str))
                        {
                            M030_002 form = new M030_002();
                            form.FormCloseEvent += DeleteTabpage;
                            form.TopLevel = false;
                            tabControl1.TabPages.Add(str);
                            tabControl1.TabPages[tabControl1.TabPages.Count - 1].Controls.Add(form);
                            tabControl1.SelectedIndex = tabControl1.TabPages.Count - 1;
                            tabControl1.TabPages[tabControl1.TabPages.Count - 1].Controls.Add(form);
    
                            Commons.DICT_REMOVE_INDEX.Add(str, tabControl1.SelectedIndex);
    
                            form.Dock = DockStyle.Fill;
                            form.Show();
    
                        }
                        else
                        {
                            tabControl1.SelectedTab = tabControl1.TabPages[Commons.DICT_REMOVE_INDEX[str]];
                        }
                        break;
                    case "ROUTE 정보":
                        if (!Commons.DICT_REMOVE_INDEX.ContainsKey(str))
                        {
                            M020_013 form = new M020_013();
                            form.FormCloseEvent += DeleteTabpage;
                            form.TopLevel = false;
                            tabControl1.TabPages.Add(str);
                            tabControl1.TabPages[tabControl1.TabPages.Count - 1].Controls.Add(form);
                            tabControl1.SelectedIndex = tabControl1.TabPages.Count - 1;
                            tabControl1.TabPages[tabControl1.TabPages.Count - 1].Controls.Add(form);
    
                            Commons.DICT_REMOVE_INDEX.Add(str, tabControl1.SelectedIndex);
    
                            form.Dock = DockStyle.Fill;
                            form.Show();
    
                        }
                        else
                        {
                            tabControl1.SelectedTab = tabControl1.TabPages[Commons.DICT_REMOVE_INDEX[str]];
                        }
                        break;
    
                }
    
            }
            private void DeleteTabpage(string temp)
            {
                int aint = 0;
                for (int i = 0; i < tabControl1.TabPages.Count; i++)
                {
                    if(tabControl1.TabPages[i].Text==temp)
                    {
                        aint = i;
                    }
                }
                tabControl1.TabPages.RemoveAt(aint);
    
                int index = Commons.DICT_REMOVE_INDEX[temp];
                
                Commons.DICT_REMOVE_INDEX.Remove(temp);
    
                //탭페이지를 앞으로 한칸씩땡긴다.
                if (Commons.DICT_REMOVE_INDEX.Count>2)
                {
                    for (int i = index; i < Commons.DICT_REMOVE_INDEX.Count; i++)
                    {
                        string tempstring = Commons.DICT_REMOVE_INDEX.FirstOrDefault(x => x.Value == i + 1).Key;
                        int tempint = Commons.DICT_REMOVE_INDEX[tempstring];
                        Commons.DICT_REMOVE_INDEX.Remove(tempstring);
                        Commons.DICT_REMOVE_INDEX.Add(tempstring, tempint - 1);
                    }
                }
                tabControl1.SelectedIndex = aint - 1;
            }
    
            int tabindex = 0;
            
            //탭컨트롤에서 탭에 그린 닫기버튼내부의 영역을 클릭하면 폼 닫기
            private void tabControl1_MouseClick(object sender, MouseEventArgs e)
            {
                
                TabControl tc = (TabControl)sender;
                tabindex = tc.SelectedIndex;
                Draw.Point p = e.Location;
                int _tabWidth = 0;
                _tabWidth = this.tabControl1.GetTabRect(tc.SelectedIndex).Width - (_imgHitArea.X);
                Draw.Rectangle r = this.tabControl1.GetTabRect(tc.SelectedIndex);
                r.Offset(_tabWidth, _imgHitArea.Y);
                r.Width = 16;
                r.Height = 16;
                if (r.Contains(p))
                {
                    TabPage TabP = (TabPage)tc.TabPages[tc.SelectedIndex];
                    tc.TabPages.Remove(TabP);
    
    
    
                    //MessageBox.Show(TabP.Text);
                    int index = Commons.DICT_REMOVE_INDEX[TabP.Text];
                    Commons.DICT_REMOVE_INDEX.Remove(TabP.Text);
    
                    //탭페이지를 앞으로 한칸씩땡긴다.
                    for (int i = index; i < Commons.DICT_REMOVE_INDEX.Count; i++)
                    {
                        string tempstring = Commons.DICT_REMOVE_INDEX.FirstOrDefault(x => x.Value == i + 1).Key;
                        int tempint = Commons.DICT_REMOVE_INDEX[tempstring];
                        Commons.DICT_REMOVE_INDEX.Remove(tempstring);
                        Commons.DICT_REMOVE_INDEX.Add(tempstring, tempint - 1);
                    }
                }
            }
           
    
    
            //탭컨트롤에 닫기 버튼 추가
            private void tabControl1_DrawItem(object sender, DrawItemEventArgs e)
            {
                try
                {
                    Draw.Image img;
    
                    Draw.Font f = this.Font;
    
                    Draw.Rectangle r = e.Bounds;
                    Draw.Brush titleBrush = new Draw.SolidBrush(Draw.Color.Black);
                    string title = this.tabControl1.TabPages[e.Index].Text;
    
    
    
                    r = this.tabControl1.GetTabRect(e.Index);
                    r.Offset(2, 2);
    
    
    
                    // SelectedTab의 Background Color 는 White으로 처리
                    if (this.tabControl1.SelectedIndex == e.Index)
                        e.Graphics.FillRectangle(new Draw.SolidBrush(Draw.Color.White), e.Bounds);
    
    
                    // 각 Tab별로 close button 에 대한 image값 
                    if (this.tabControl1.SelectedTab == this.tabControl1.TabPages[e.Index])
                        img = Properties.Resources.Cancel2;
                    else
                        img = Properties.Resources.Cancel2;
    
                    // TabPage Text
                    e.Graphics.DrawString(title+ " ", f, titleBrush, new Draw.PointF(r.X, r.Y));
    
    
                    // TabPage 의 닫기 버튼
                    e.Graphics.DrawImage(img, new Draw.Point(r.X + this.tabControl1.GetTabRect(e.Index).Width - _imageLocation.X, _imageLocation.Y));
    
                    img.Dispose();
                    img = null;
                }
    
    
                catch (Exception)
                {
                }
               
            }
    
        }
        
    }
    
Designed by Tistory.