✅ Show() vs ShowDialog() 차이
항목 Show() ShowDialog()
| 형태 | 비모달 (Non-modal) | 모달 (Modal) |
| 기본 의미 | 폼을 띄우되, 메인 프로그램은 계속 실행됨 | 폼을 띄우면 그 폼 닫을 때까지 다른 작업 불가 |
| 다른 폼과 상호작용 | 가능 (동시에 여러 폼 조작 가능) | 불가능 (열린 폼 닫기 전까지 다른 폼 못 조작) |
| 사용 예 | 옵션 설정 창, 다중 창을 동시에 띄울 때 | 확인창, 입력창, 경고창 등 사용자가 응답해야 하는 경우 |
| 반환값 | 없음 | DialogResult 반환 (예: OK, Cancel 등) |
✅ 예제 비교
📌 Show() 예제 (비모달)
frmManualCNV f = new frmManualCNV(1085);
f.Show(); // 폼이 열리고, 기존 폼도 계속 사용할 수 있음
결과: 새 폼이 열리면서, 기존 폼도 마우스로 클릭하거나 조작 가능함.
📌 ShowDialog() 예제 (모달)
frmManualCNV f = new frmManualCNV(1085);
DialogResult result = f.ShowDialog(); // 사용자가 닫기 전까지 프로그램 멈춤
결과: 새 폼이 열리고, 그 창을 닫기 전까지 다른 폼 조작 불가
→ 예를 들어, "설정창", "로그인 창", "경고창" 같은 데 사용함.
✅ ShowDialog()를 쓰는 이유
- 사용자가 선택하거나 입력을 완료하기 전까지 다른 행동 못 하게 하려는 경우
- 폼에서 DialogResult로 결과값을 받아 처리하고 싶은 경우
예제:
frmLogin loginForm = new frmLogin();
if (loginForm.ShowDialog() == DialogResult.OK)
{
// 로그인 성공한 경우만 다음 단계 진행
}
🧠 요약
구분 내용
| Show() | 비모달. 새 폼 띄우고도 기존 폼 사용 가능. 동시에 여러 폼 작업 가능 |
| ShowDialog() | 모달. 폼을 닫기 전까지 다른 작업 불가. 주로 확인/입력 창에 사용 |
ShowDialog()는 주로 사용자로 하여금 해당 폼에서 반드시 뭔가를 하고 나서 다른 곳으로 가도록 유도할 때 사용한다.
+ DialogResult 커스터마이징하기
=> **모달 폼(ShowDialog로 띄운 폼)**에서 사용자가 어떤 버튼을 눌렀는지 판단하기 위해 직접 결과값(DialogResult)을 설정하는 방법
즉, 사용자가 확인을 눌렀는지, 취소했는지, 등을 DialogResult.OK, DialogResult.Cancel 같은 값으로 호출한 쪽에서 판단할 수 있게한다.
✅ 기본 구조
📌 폼 띄우는 쪽 (부모 폼):
frmLogin loginForm = new frmLogin();
DialogResult result = loginForm.ShowDialog();
if (result == DialogResult.OK)
{
// 로그인 성공 처리
}
else
{
// 로그인 취소 또는 실패 처리
}
✅ 자식 폼 (frmLogin 등)에서 DialogResult 설정 방법
✔ 방법 1: 버튼의 DialogResult 속성 설정
- 디자이너에서 버튼을 선택하고 DialogResult 속성을 OK, Cancel, 등으로 지정할 수 있습니다.
또는 코드로 직접 지정:
private void btnOK_Click(object sender, EventArgs e)
{
// 입력값 검증 등 로직 처리 후
this.DialogResult = DialogResult.OK; // OK 버튼처럼 작동
this.Close(); // 폼을 닫음
}
private void btnCancel_Click(object sender, EventArgs e)
{
this.DialogResult = DialogResult.Cancel;
this.Close();
}
✔ 방법 2: 반환값 커스터마이징 (조건 따라 결정)
private void btnLogin_Click(object sender, EventArgs e)
{
if (txtID.Text == "admin" && txtPassword.Text == "1234")
{
this.DialogResult = DialogResult.OK;
}
else
{
MessageBox.Show("로그인 실패");
return; // 창 닫지 않음
}
this.Close();
}
✅ 커스터마이징 예제 전체 흐름
🔹 부모 폼 (MainForm)
frmLogin login = new frmLogin();
if (login.ShowDialog() == DialogResult.OK)
{
MessageBox.Show("로그인 성공");
}
else
{
MessageBox.Show("로그인 실패 또는 취소");
}
🔹 자식 폼 (frmLogin)
private void btnOK_Click(object sender, EventArgs e)
{
if (txtUser.Text == "admin" && txtPwd.Text == "1234")
{
this.DialogResult = DialogResult.OK; // 부모가 OK로 받을 수 있음
this.Close();
}
else
{
MessageBox.Show("아이디 또는 비밀번호가 틀렸습니다.");
}
}
private void btnCancel_Click(object sender, EventArgs e)
{
this.DialogResult = DialogResult.Cancel;
this.Close();
}
🔁 지원되는 DialogResult 값들
값 의미
| OK | 확인 |
| Cancel | 취소 |
| Yes, No | 질문 창 등에 사용 |
| Abort, Retry, Ignore | 예외 처리 또는 특수 시나리오 |
| None | 아무 처리도 안 함 |
🧠 요약
목표 방법
| 부모 폼에서 사용자 선택 여부를 확인 | ShowDialog() → DialogResult 값 확인 |
| 자식 폼에서 결과 설정 | this.DialogResult = DialogResult.XXX; 후 this.Close(); |
| UI 버튼에 직접 설정 가능 | 디자이너에서 DialogResult 속성 설정 가능 |
'C#' 카테고리의 다른 글
| [ C# ] WinForms Tag 속성 (0) | 2025.06.17 |
|---|---|
| C# | 디자인패턴 싱글톤 (0) | 2025.06.05 |
| [ C# ] ToolStripContainer 컨트롤 - 윈폼 레이아웃 컨테이너 컨트롤 (0) | 2025.05.22 |
| [ C# ] SuspendLayout, ResumeLayout - 폼/컨트롤의 레이아웃 계산을 일시 중단하기 (0) | 2025.05.21 |
| C# 인터넷 또는 제한 영역에 있거나 파일에 웹 표시가 있으므로 처리할 수 없습니다. (0) | 2025.05.15 |