Panel 이나 Tabpage 로 Layout 을 구성하였는데, 다른 폼을 Panel / TabPage 안에 띄우고 싶을 때 처리하는 방법을 구글검색과 직접 테스트를 하면서 분석하여 알게 된 것을 적어둔다.
아래 화면을 보면 tabPage4 에 원래 보이는 화면과 아래에는 달력폼이 있는 화면을 가져와서 보여주고 있다.
어떻게 하면 새로운 Form2 의 화면을 tabPage4 에 보이도록 할 수 있을까?
https://msdn.microsoft.com/ko-kr/library/system.windows.forms.control%28v=vs.110%29.aspx
에 Control 클래스의 정의를 보면 시각적으로 표시되는 구성 요소인 컨트롤의 기본 클래스를 정의한다고 설명되어 있다.
http://www.csharpstudy.com/Threads/uithread.aspx 에 보면 WinForm의 UI 컨트롤들은 Control 클래스로부터 파생된 클래스들 이라고 되어 있다.
Designer.cs 파일을 열어서 tabPag4 부분을 찾아보면 ...tabPage4.Controls.Add 에 splitContainer4 를 추가한 것을 알 수 있다. 물론 마우스 몇번 까딱까딱하면 자동으로 만들어진다. 만들어진 내용이 바로 여기에 적혀 있다.
//
// tabPage4
//
this.tabPage4.Controls.Add(this.splitContainer4);
this.tabPage4.Location = new System.Drawing.Point(4, 22);
this.tabPage4.Name = "tabPage4";
this.tabPage4.Padding = new System.Windows.Forms.Padding(3);
this.tabPage4.Size = new System.Drawing.Size(1118, 396);
this.tabPage4.TabIndex = 1;
this.tabPage4.Text = "tabPage4";
this.tabPage4.UseVisualStyleBackColor = true;
//
원래 화면에 추가했던 Control 클래스 대신에 버튼을 누르면 다른 클래스가 추가되도록 하고 싶다.
거기다가 새로 추가하는 것은 New Form2 를 추가하고 싶다.
순서는 tablPage5 로 화면 이동시키고, tabPage4 에 추가된 Control 을 전부 제거(Clear) 한 다음, tabPage4 에 추가된 모든 Control 들을 제거(remove) 했다.
그 다음에 새폼의 Control 을 추가(Add)했다.
불필요한 게 있을 수도 있다. 일단은 이렇게 추가해서 테스트를 해봤다.
private void Form2Tab_Click(object sender, EventArgs e)
{
// tabPage5 선택창으로 화면 이동시키기
tabControl2.Enabled = false;
tabControl2.SelectedTab = tabPage4;
tabControl2.Enabled = true;
tabPage4.Controls.Clear(); // Controls 전부 제거
foreach (Control item in tabPage4.Controls.OfType<Control>())
{
tabPage4.Controls.Remove(item);
}
this.Invoke(new MethodInvoker(delegate ()
{
// 다른 폼을 Tabpage/Panel 에 띄우기
Form2 tabfrm = new Form2();
tabfrm.TopLevel = false;
tabfrm.TopMost = true;
//panel1.Controls.Add(tabfrm); // panel1 에다 추가
//splitContainer6.Panel1.Controls.Add(tabfrm); // splitContainer6.Panel1 에다 추가
tabPage4.Controls.Add(tabfrm);
tabfrm.Show();
}));
}
원래 화면으로 복구시키는 것은 Designer.cs 파일에 있는 걸 Conrol.Add 해주면 된다.
private void toolStripButton5_Click(object sender, EventArgs e)
{
// tabPage4 원래 화면으로 복구시키기
tabControl2.Enabled = false;
tabControl2.SelectedTab = tabPage4;
tabControl2.Enabled = true;
tabPage4.Controls.Clear(); // Controls 전부 제거
foreach (Control item in tabPage4.Controls.OfType<Control>())
{
tabPage4.Controls.Remove(item);
}
tabPage4.Controls.Add(this.splitContainer4);
}
구글링해서 찾은걸 적어 놓는다.
private void btn_Click(object sender, EventArgs e)
{
panel1.Controls.Clear(); //to remove all controls
//to remove all comboboxes
foreach (Control item in panel1.Controls.OfType<ComboBox>())
{
panel1.Controls.Remove(item);
}
//to remove control by Name
foreach (Control item in panel1.Controls.OfType<Control>())
{
if (item.Name == "bloodyControl")
panel1.Controls.Remove(item);
}
//to remove just one control, no Linq
foreach (Control item in panel1.Controls)
{
if (item.Name == "bloodyControl")
{
panel1.Controls.Remove(item);
break; //important step
}
}
}
'C# > Layout 및 델리게이트' 카테고리의 다른 글
C# 폼간 데이터 전송 (부모폼에서 자식폼, 자식폼에서 부모폼) (0) | 2015.11.29 |
---|---|
C# 폼 데이터 받아서 처리 (폼 중복열기 방지) (0) | 2015.10.26 |
C# 폼 중복실행 방지, Show(), ShowDialog() (2) | 2015.09.20 |
C# MDI(Multiple Document Interface) (0) | 2015.09.17 |
C# Layout : SplitContainer (0) | 2015.09.08 |