C#

[C#] 비모달- Show() 과 모달-ShowDialog() 의 차이

채린.__. 2025. 5. 22. 15:32

 


✅ 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 속성 설정 가능