윈도우 응용 프로그램을 개발할 때 메뉴가 있는 메인 윈폼을 하나 만들고 각 메뉴에 해당하는 각각의 윈폼을 별도로 만들어 메뉴를 선택하면 해당 윈폼이 열리도록 개발하게 됩니다.
일반적으로 메뉴를 선택할 때마다 윈폼은 반복해서 열리게 됩니다. 엑셀 화면을 여러 개 열고 작업하듯이 같은 윈폼도 여러 개 열고 작업하는 것이 편할 수도 있습니다.
하지만 경우에 따라서는 하나의 윈폼은 한번만 열리도록 프로그램을 개발해야 할 경우도 생깁니다.
동일한 WinForm이 열여 있는지 확인하고 열려있지 않을 경우에만 윈폼이 열리도록 하는 방법과 메인 폼이 종료될 때 열려 있는 모든 Form을 닫고 종료하는 방법에 대해 예제를 통해 알아보겠습니다.
프로그램에 대한 실행 화면과 설명
▶ 테스트 용 프로젝트에는 총 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을 닫는 로직을 구현할 경우 위와 같은 에러가 발생하게 됩니다.
따라서 별도의 리스트에 추가한 뒤 처리해야 에러가 발생하지 않습니다.
※ 함께 읽으면 도움이 될 만한 다른 포스팅 글입니다.
이 글이 도움이 되었기를 바랍니다. ^-^