※ 본 실습 진행 전, 아래 게시물을 확인하고 오시길 바랍니다.
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가 뜨게 하는 버튼.
버튼의 개수가 많아졌으므로 알아보기 쉽게 버튼의 이름을 지정해준다.
이 두 버튼에 클릭 이벤트를 선언한다.
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");
}
지금까지 자식 폼 호출 시 부모 폼 기능 비활성화하기 위한 실습을 진행해 보았습니다.
도움이 되셨길 바랍니다. 감사합니다.
'개발 공부 > C# 학습' 카테고리의 다른 글
[C# 학습] DataGridView의 DataSource - DataTable? BindingList? (0) | 2023.07.14 |
---|---|
[C# 학습] DataTable 검색 기능(Select 이용) /DB 테이블 필드 이름 공백 (0) | 2022.12.13 |
[C# 학습] 자식 폼 하나만 활성화하기(Show() 폼 중복 실행 방지, FormClosing 활용) (2) | 2022.11.25 |
[C# 학습] C#으로 Excel Export, Excel 원하는 셀 위치에 이미지 삽입(worksheet.Paste) (0) | 2022.11.17 |
[C# 학습] 폼1 -> 폼2 데이터 전송(다른 폼에 데이터(클래스) 전송, 이벤트 이용) (0) | 2022.11.08 |