C# 윈폼에서 동일한 폼이 열려 있는지 확인하는 예제와 열려 있는 모든 폼을 닫는 예제


윈도우 응용 프로그램을 개발할 때 메뉴가 있는 메인 윈폼을 하나 만들고 각 메뉴에 해당하는 각각의 윈폼을 별도로 만들어 메뉴를 선택하면 해당 윈폼이 열리도록 개발하게 됩니다.

일반적으로 메뉴를 선택할 때마다 윈폼은 반복해서 열리게 됩니다. 엑셀 화면을 여러 개 열고 작업하듯이 같은 윈폼도 여러 개 열고 작업하는 것이 편할 수도 있습니다.

하지만 경우에 따라서는 하나의 윈폼은 한번만 열리도록 프로그램을 개발해야 할 경우도 생깁니다.

동일한 WinForm이 열여 있는지 확인하고 열려있지 않을 경우에만 윈폼이 열리도록 하는 방법과 메인 폼이 종료될 때 열려 있는 모든 Form을 닫고 종료하는 방법에 대해 예제를 통해 알아보겠습니다.

프로그램에 대한 실행 화면과 설명

C# 윈폼에서 동일한 폼이 열려 있는지 확인하는 예제와 열려 있는 모든 폼을 닫는 예제

▶ 테스트 용 프로젝트에는 총 3개의 Form을 만들었습니다.

  • Form1 : 메인 폼에 해당하며 Form2와 Form3를 여는 버튼과 열려 있는 모든 Form을 닫고 종료하는 버튼이 있습니다.
  • Form2, Form3 : 메인 폼(Form1)에 의해 열려지는 서브 윈폼 입니다.


▶ 테스트 시나리오

  • 위의 캡처 화면은 Form2 열기 버튼을 3번 클릭하고, Form3 열기 버튼을 3번 클릭했을 때의 화면입니다.
  • 동일하게 Form2와 Form3를 각각 3번 열기를 클릭했는데 Form3만 창이 3개 열려 있고, Form2는 하나만 창이 열려 있습니다.
  • Form2 열기를 클릭했을 때는 동일한 폼이 있는지 체크하고 없는 경우에만 윈폼을 열도록 구현하였습니다.

C# 윈폼에서 동일한 폼이 열려 있는지 확인하는 예제와 열려 있는 모든 폼을 닫는 예제

▶ 아래 C# 소스는 위의 Project에서 Form1의 소스 코드입니다.

using System;
using System.Collections.Generic;
using System.Windows.Forms;
 
namespace WindowsFormsApp1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
 
        // Form이 열려 있지 않은 경우에만 Form 열기
        private void btnForm2_Click(object sender, EventArgs e)
        {
            var form = Application.OpenForms[“Form2”];
            if (form == null)
            {
                form = new Form2();
            }
            form.Show();
        }
 
        // 일반적인 윈폼 열기
        private void btnForm3_Click(object sender, EventArgs e)
        {
            Form3 form = new Form3();
            form.Show();
        }
 
        // 열려 있는 모든 Form 닫기
        private void btnAllClose_Click(object sender, EventArgs e)
        {
            List<Form> formsToClose = new List<Form>();
 
            foreach (Form form in Application.OpenForms)
            {
                if (form != this)  // 만약 자기 자신 Form도 닫을 경우 if문 생략
                {
                    formsToClose.Add(form);
                }
            }
 
            formsToClose.ForEach(f => f.Close());
        }
    }
}
 

C# 소스 코에 대한 간략한 설명

▶ 위의 소스 코드에 대한 간단한 설명입니다.

  • List를 사용하기 위해 using System.Collections.Generic; 선언을 해 줍니다.
  • Application.OpenForms은 애플리케이션에서 소유한 열려 있는 폼의 컬렉션을 가져옵니다.
  • if (form != this) 해당 if문은 자기 자신은 폼 닫기에서 제외하기 위한 구문입니다.
  • formsToClose.ForEach(f => f.Close()); 해당 구문은 아래 foreach문과 동일한 작업을 의미합니다.
    foreach (Form f in formsToClose)
    {
        f.Close();
    }

만약 위의 예제에서 foreach 문에서 Form을 닫는 로직을 바로 구현한다면

▶ 만약 위의 예제에서 foreach 문에서 Form을 닫는 로직(form.close();)을 바로 구현한다면 예기치 못한 오류가 발생하게 됩니다.

foreach 문에서 Form을 닫는 로직을 바로 구현 시 에러 발생

에러 내용 : ‘컬렉션이 수정되었습니다. 열거 작업이 실행되지 않을 수도 있습니다.’

컬렉션이 수정되었습니다. 열거 작업이 실행되지 않을 수도 있습니다.


foreach문에서 Form을 닫는 로직을 구현할 경우 위와 같은 에러가 발생하게 됩니다.
따라서 별도의 리스트에 추가한 뒤 처리해야 에러가 발생하지 않습니다.





이 글이 도움이 되었기를 바랍니다. ^-^


답글 남기기