-
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) { } } } }
'C#' 카테고리의 다른 글
C# 윈폼차트 <= 라즈베리파이(MySql서버) <=DHT11온습도 센서 (0) 2020.09.18 C# 윈폼 책정보 MySql 커넥션 (0) 2020.09.18 C# LINQ XML 추출 (0) 2020.09.18 c# 윈폼 패킷 아날라이저 (0) 2020.09.18 내가 쓰려고 만든 C# 윈폼 템플릿(Check박스를 이용한 Delete) (0) 2020.09.15