개발 공부/C# 학습

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

아밍나 2022. 11. 25. 14:27
728x90

※ 본 실습 진행 전, 아래 게시물을 확인하고 오시길 바랍니다.

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

 

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

메인 폼에서 자식 폼을 여는 방법은 두 가지가 있다. 1. Show(): 해당 폼이 닫히기 전이라도 다른 폼 사용 가능. 2. ShowDialog(): 해당 폼이 닫히기 전까지 다른 폼 사용 불가능. ShowDialog의 경우는 상관

it-amin.tistory.com


※ 기초적인 내용까지 담고 있으니

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

- 실습 진행

'자식 폼 하나만 활성화하기' 실습에서는 메인 폼에서 Form.Show()를 통해 자식폼 하나를 호출하면 다른 자식폼들은 호출 못하도록 하였는데요.

여기에 폼 호출이 아닌, 메시지 박스를 뜨게 하는 기능을 가진 새로운 컨트롤을 추가해보도록 하겠습니다.

1) 새로운 컨트롤 추가

 

messagebox1 pop 와 messagebox2 pop
: 버튼을 누르면 messageBox가 뜨게 하는 버튼.

 

버튼의 개수가 많아졌으므로 알아보기 쉽게 버튼의 이름을 지정해준다.

 

messagebox1 pop의 버튼 name
messagebox2 pop의 버튼 name

 

이 두 버튼에 클릭 이벤트를 선언한다.

 

private void messageBox_button1_Click(object sender, EventArgs e)
{
    MessageBox.Show("첫 번째 messageBox Show");
}

private void messageBox_button2_Click(object sender, EventArgs e)
{
    MessageBox.Show("두 번째 messageBox Show");
}

 

실행 결과)

messagebox1 pop 버튼을 누르면 "첫 번째 messageBox Show"라는 내용의 MessageBox가 뜸.

 

form1 open을 누른 후에 messagebox1 pop 버튼을 눌러보면 이것 또한 잘 동작한다.

그런데 여기서, 자식폼이 활성화 되어 있을 때 부모 폼(Main Form)의 기능도 막고싶다면 어떻게 해야할까?

 

간단하게 해결 가능하다.


1) Controls 활용

Controls는 컨트롤에 포함된 컨트롤의 컬렉션을 나타낸다.

 

 private void activateForm(Form activateForm)
{
    if (activateFormExist == false)
    {
        activateFormExist = true;
        activateForm.Show();
        activateForm.TopMost = true;

        //////////////////////////////////////////////////////////
        foreach (Control control in this.Controls)
        {
            control.Enabled = false;
        }
        /////////////////////////////////////////////////////////

        activateForm.FormClosing += formClosingEvent;
    }
}
  • MainForm에 있는 컨트롤들을 가지고 와서 해당 컨트롤들의 사용 여부를 false로 지정한다.

2) FormClosing 이벤트 수정

private void formClosingEvent(object sender, EventArgs e)
{
    activateFormExist = false;
    foreach (Control control in this.Controls)
    {
        control.Enabled = true;
    }
}
  • 실행중이던 폼을 닫으면 MainForm의 컨트롤들을 다시 사용할 수 있어야 한다.

결과)

Form1 호출 시 MainForm의 다른 컨트롤들이 비활성화 된다.

Form1을 닫으면 MainForm의 다른 컨트롤들을 다시 사용할 수 있게 된다.

 


- 총 정리 코드

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;

        foreach (Control control in this.Controls)
        {
            control.Enabled = false;
        }

        activateForm.FormClosing += formClosingEvent;
    }
}

private void formClosingEvent(object sender, EventArgs e)
{
    activateFormExist = false;
    foreach (Control control in this.Controls)
    {
        control.Enabled = true;
    }
}

private void messageBox_button1_Click(object sender, EventArgs e)
{
    MessageBox.Show("첫 번째 messageBox Show");
}

private void messageBox_button2_Click(object sender, EventArgs e)
{
    MessageBox.Show("두 번째 messageBox Show");
}

지금까지 자식 폼 호출 시 부모 폼 기능 비활성화하기 위한 실습을 진행해 보았습니다.

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

728x90
반응형