개발 공부/C# 학습

[C# 학습] 자식 폼 하나만 활성화하기(Show() 폼 중복 실행 방지, FormClosing 활용)

아밍나 2022. 11. 25. 13:43
728x90

메인 폼에서  자식 폼을 여는 방법은 두 가지가 있다.

1. Show(): 해당 폼이 닫히기 전이라도 다른 폼 사용 가능.
2. ShowDialog(): 해당 폼이 닫히기 전까지 다른 폼 사용 불가능.

 

ShowDialog의 경우는 상관이 없지만,

Show로 자식 폼을 열었을 때 다른 폼이 중복으로 뜨지 않게 하기 위해서는 설정을 해주어야 한다.


※ 단계별 학습을 원치 않는 분은 총 정리 코드로 이동하셔서 보시면 됩니다.

- 실습 진행

메인 폼: MainForm.cs
자식 폼: Form1.cs, Form2.cs, Form3.cs

1. bool 선언

bool activateFormExist = false;
  • 열려있는 폼이 존재하는지 아닌지를 확인하기 위한 bool을 선언한다.

2. 메인 폼에 Button 삽입

  • 클릭 시 원하는 자식 폼이 열리게 할 버튼을 메인 폼에  추가한다.

3. Button Click Event 생성

private void button1_Click(object sender, EventArgs e)
{

}

private void button2_Click(object sender, EventArgs e)
{

}

private void button3_Click(object sender, EventArgs e)
{

}
  • 각 버튼마다 Click Event를 생성한다.

4. Form 인스턴스 생성

private void button1_Click(object sender, EventArgs e)
{
    Form1 form1 = new Form1();
}

private void button2_Click(object sender, EventArgs e)
{
    Form2 form2 = new Form2();
}

private void button3_Click(object sender, EventArgs e)
{
    Form3 form3 = new Form3();
}
  • 각 Click Event마다 Show() 해줄 Form 인스턴스를 생성한다.

5. ActivateForm 메서드 선언

private void activateForm(Form activateForm)
{
    if(activateFormExist == false)
    {
        activateFormExist = true;
        activateForm.Show();
        activateForm.TopMost = true; //해당 폼을 맨 위로
        
        activateForm.FormClosing += formClosingEvent;
    }
}
  • activateFormExist(열려있는 폼이 존재하는지 아닌지를 확인하기 위한 bool 변수)가 false 일 때 자식 폼을 Show() 하도록 코드를 작성한다.
  • Show() 했던 자식폼을 닫으면, formClosingEvent(사용자 선언) 이벤트가 실행된다.
  • 특정 자식 폼이 실행중일 때 activateFormExist(열려있는 폼이 존재하는지 아닌지를 확인하기 위한 bool 변수)는 true이다.

6. FormClosing 이벤트 추가

private void formClosingEvent(object sender, EventArgs e)
{
    activateFormExist = false;
}
  • 실행중이던 폼을 닫으면 activateFormExist 변수를 다시 false로 바꿔주어야 한다.

7. Button Click Event에 메서드 추가

private void button1_Click(object sender, EventArgs e)
{
    Form1 form1 = new Form1();
    activateForm(form1);
}

private void button2_Click(object sender, EventArgs e)
{
    Form2 form2 = new Form2();
    activateForm(form2);
}

private void button3_Click(object sender, EventArgs e)
{
    Form3 form3 = new Form3();
    activateForm(form3);
}

 

이와같이 진행하면, form1이 활성화 되어있을 때 form2와 form3 버튼을 눌러도 폼이 실행되지 않는다. 

다시 말해, 하나의 자식폼이 실행중이라면 다른 자식폼들은 실행되지 않도록 막은 것이다.


- 총 정리 코드

bool activateFormExist = false;

private void button1_Click(object sender, EventArgs e)
{
    Form1 form1 = new Form1();
    activateForm(form1);
}

private void button2_Click(object sender, EventArgs e)
{
    Form2 form2 = new Form2();
    activateForm(form2);
}

private void button3_Click(object sender, EventArgs e)
{
    Form3 form3 = new Form3();
    activateForm(form3);
}

private void activateForm(Form activateForm)
{
    if(activateFormExist == false)
    {
        activateFormExist = true;
        activateForm.Show();
        activateForm.TopMost = true; //해당 폼을 맨 위로
        
        activateForm.FormClosing += formClosingEvent;
    }
}

private void formClosingEvent(object sender, EventArgs e)
{
    activateFormExist = false;
}

지금까지 자식 폼 하나만 활성화하기 위한 실습을 진행해 보았습니다.

도움이 되셨길 바랍니다. 감사합니다.

 

 

 

 

 

 

 

 

 

 

→ 다음 실습 이어서 하기

https://it-amin.tistory.com/99

 

[C# 학습] 자식 폼 호출 시 부모 폼 기능 비활성화(Form 호출 시 다른 Form 사용 막기, Controls 활용)

※ 본 실습 진행 전, 아래 게시물을 확인하고 오시길 바랍니다. https://it-amin.tistory.com/98 [C# 학습] 자식 폼 하나만 활성화하기(Show() 폼 중복 실행 방지, FormClosing 활용) 메인 폼에서 자식 폼을 여는

it-amin.tistory.com

 

728x90
반응형