본문 바로가기

프로그래밍&IT/C#

[Winform] SuspendLayout / ResumeLayout & PerformLayout 에 대해서

나름대로 공부를 했다고해도 자꾸 잊게 되더라..

여튼 이번엔 C# winform에서 쓰이는 SuspendLayout과 ResumeLayout (PerformLayout)

관련해서

 

[C# winform] SuspendedLayout & ResumeLayout

UI 컨트롤의 레이아웃 업데이트를 효율적으로 관리하기 위해 사용되며, 이를 통해 불필요한 리소스 사용을 줄이고 성능을 최적화할 수 있다.

SuspendLayout

  • 목적: 레이아웃 업데이트를 일시적으로 중단.
  • 여러 컨트롤을 추가하거나 크기 및 속성을 변경하는 작업 중레이아웃 업데이트가 계속해서 발생하는 것을 방지.
  • 성능 향상: 잦은 레이아웃 업데이트로 인한 성능 저하를 줄인다.

ResumeLayout, PerformLayout

  • 목적: 중단된 레이아웃 업데이트를 다시 시작.
  • 파라미터:
    • true: 레이아웃이 즉시 강제로 갱신.
      • 이 옵션은 변경 사항이 즉시 반영되어야 할 때 사용.
this.SuspendLayout(); // 레이아웃 중지
// 컨트롤 추가 및 속성 변경
Button button1 = new Button();
button1.Text = "Click Me";
button1.Size = new Size(100, 50);
button1.Location = new Point(10, 10);
this.Controls.Add(button1);
this.ResumeLayout(true); // 레이아웃 즉시 갱신
  • false: 레이아웃 갱신을 지연합니다.
    • 변경이 완료된 후에 명시적으로 PerformLayout을 호출해서 갱신해야 한다.
    • 대규모 작업 후 갱신을 제어하고 싶을 때 사용
this.SuspendLayout(); // 레이아웃 업데이트 중지
// 컨트롤 추가 및 속성 변경
button1.Size = new Size(100, 50);
button1.Location = new Point(10, 10);
this.Controls.Add(button1);

button2.Size = new Size(100, 50);
button2.Location = new Point(120, 10);
this.Controls.Add(button2);

this.ResumeLayout(false);
this.PerformLayout();     // 필요한 경우 강제로 레이아웃 갱신

 

주요 포인트

  1. 언제 사용하는가?
    • 폼이나 패널에 많은 컨트롤을 추가하거나 변경하는 경우.
    • 여러 컨트롤의 크기나 위치를 동적으로 변경할 때.
    • 화면이 깜빡이는 현상을 방지하고 작업 효율성을 높이기 위해.
  2. 중첩 가능
    SuspendLayout을 여러 번 호출한 경우, ResumeLayout을 동일한 횟수만큼 호출해야 레이아웃 업데이트가 재개된다.
  3. 주의사항
    • SuspendLayout과 ResumeLayout은 같은 컨트롤에 대해 호출해야 한다.
    • 레이아웃 갱신을 잊지 않도록 항상 ResumeLayout을 호출하는 것이 중요하다.

많은 컨트롤을 동적으로 추가하는 상황

this.SuspendLayout(); // 레이아웃 중지
for (int i = 0; i < 10; i++) {
    Button btn = new Button();
    btn.Text = $"Button {i + 1}";
    btn.Size = new Size(100, 30);
    btn.Location = new Point(10, i * 40); // 버튼 위치 동적으로 계산
    this.Controls.Add(btn);
}
this.ResumeLayout(true); // 레이아웃 재개 및 갱신
 
 
기초적인 내용이지만 다시 한 번 봐볼만한 내용.
이번 프로젝트에서 동적으로 컨트롤들을 다루는 내용이 있다보니...