728x90

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






블로그 이미지

Link2Me

,