C#에서 일부 메뉴를 숨겨 놓았는데, '디버깅' 또는 '관리자'인 경우에 모든 메뉴를 보이도록 하는 경우가 있을 것입니다. 특히 MenuStrip 컨트롤을 사용해 다양한 메뉴를 다루다 보면, 계층 구조를 가진 메뉴에서 '모든 항목을 한 번에 표시'하고 싶을 때가 있을 거예요. 이를 해결하기 위한 예제 코드입니다.
모든 메뉴 보이도록 하는 방법
아래는 MenuStrip의 모든 메뉴와 서브메뉴를 한 번에 표시할 수 있는 재귀 호출 방식의 코드입니다.
// MenuStrip의 모든 항목을 표시하도록 설정하는 코드
private void SetVisibleTrueAll()
{
foreach (ToolStripMenuItem menu in menuStrip.Items)
{
SetVisibleTrue(menu);
}
}
private void SetVisibleTrue(ToolStripMenuItem menuItem)
{
menuItem.Visible = true;
foreach (ToolStripItem subItem in menuItem.DropDownItems)
{
if (subItem is ToolStripMenuItem subMenuItem)
{
SetVisibleTrue(subMenuItem); // 재귀 호출로 서브 메뉴 처리
}
else
{
subItem.Visible = true; // 일반 항목 처리
}
}
}
코드의 작동 방식과 구현 원리
SetVisibleTrueAll메서드
최상위MenuStrip의 모든 메뉴 항목(menuStrip.Items)을 순회하며, 각 항목에 대해SetVisibleTrue를 호출합니다.SetVisibleTrue메서드- 특정 메뉴 항목(
ToolStripMenuItem)의Visible속성을true로 설정합니다. - 해당 메뉴의
DropDownItems를 순회하여, 각 서브 항목도 처리합니다. - 서브 항목이 또 다른 메뉴 항목(
ToolStripMenuItem)일 경우 재귀 호출로 계속 처리하여 모든 서브메뉴가 보이도록 설정합니다. - 일반 항목(
ToolStripItem)일 경우에도Visible속성을true로 설정해 서브메뉴와 함께 표시됩니다.
- 특정 메뉴 항목(
활용 사례
- 유동적인 메뉴 표시
관리자와 일반 사용자를 구분하여 메뉴를 다르게 표시하거나, 특정 조건에 따라 메뉴의 보이는 범위를 제어할 때 사용할 수 있습니다. - 디버깅 또는 UI 점검
개발 단계에서 숨겨진 모든 메뉴와 항목을 한 번에 보이게 하여 UI 검토 작업을 간소화할 수 있습니다.
코드의 장점
- 재귀 호출 방식으로 유연함
메뉴 계층 구조의 깊이에 제한 없이 모든 메뉴를 처리할 수 있습니다. 즉, 2단, 3단, 4단 이상의 메뉴도 문제없이 처리합니다. - 가독성과 유지보수 용이
코드를 두 가지 함수로 분리하여 전체적인 구조를 간결하고 이해하기 쉽게 만들었습니다. - 확장 가능성
필요하다면 추가적인 로직(예: 특정 조건에서만 보이도록 설정)을 쉽게 적용할 수 있습니다.
예제 활용 화면
이 코드를 실제로 적용하면, 개발 중 숨겨진 모든 메뉴와 서브메뉴가 아래와 같은 구조로 한 번에 표시됩니다
- 파일 (Visible: true)
└ 새로 만들기 (Visible: true)
└ 열기 (Visible: true)
└ 최근 문서 (Visible: true)
- 편집 (Visible: true)
└ 잘라내기 (Visible: true)
└ 복사 (Visible: true)
└ 붙여넣기 (Visible: true)
이처럼 계층적으로 숨겨져 있던 메뉴가 모두 열리기 때문에, 메뉴의 UI와 로직을 점검하기에도 편리합니다.
