C#/Window

RichTextBox에 텍스트 추가하고 자동 스크롤하기

코샵 2024. 7. 23. 10:28
반응형

Windows Forms 애플리케이션을 개발할 때, 디버깅 및 로깅 용도로 RichTextBox 컨트롤을 사용하는 경우가 많습니다. 이때 RichTextBox에 텍스트를 추가하고 자동으로 스크롤을 내리는 기능은 매우 유용합니다.

아래는 RichTextBox에 텍스트를 추가하고 자동으로 스크롤을 내리는 C# 코드입니다

 

public void AddDebugLog(string message)
{
    if (rchDebug.InvokeRequired)
    {
        rchDebug.Invoke(new MethodInvoker(() =>
        {
            if (rchDebug.Text.Length > 1000000) rchDebug.Clear();
            rchDebug.AppendText(message + Environment.NewLine);
            rchDebug.SelectionStart = rchDebug.TextLength;
            rchDebug.ScrollToCaret();
        }));
    }
    else
    {
        if (rchDebug.Text.Length > 1000000) rchDebug.Clear();
        rchDebug.AppendText(message + Environment.NewLine);
        rchDebug.SelectionStart = rchDebug.TextLength;
        rchDebug.ScrollToCaret();
    }
}

이 코드는 다음과 같은 기능을 수행합니다:

  1. rchDebug.Text.Length > 1000000일 경우 RichTextBox의 내용을 모두 지웁니다. 이는 RichTextBox의 크기를 관리하기 위해서입니다.
  2. rchDebug.AppendText(message + Environment.NewLine);을 통해 메시지를 RichTextBox에 추가합니다.
  3. rchDebug.SelectionStart = rchDebug.TextLength;를 통해 텍스트의 끝 부분을 선택합니다.
  4. rchDebug.ScrollToCaret();을 통해 선택한 부분으로 자동으로 스크롤합니다.

여기서 주목해야 할 부분은 rchDebug.InvokeRequired를 사용하는 이유입니다.

 

RichTextBox와 같은 Windows Forms 컨트롤은 UI 스레드에서만 접근할 수 있습니다. 따라서 별도의 스레드에서 RichTextBox를 업데이트하려면 Invoke 메서드를 사용하여 UI 스레드에서 실행해야 합니다.

 

rchDebug.InvokeRequired를 체크하여 현재 스레드가 UI 스레드인지 확인합니다. 만약 UI 스레드가 아니라면 rchDebug.Invoke()를 사용하여 UI 스레드에서 텍스트 추가 및 스크롤 작업을 수행합니다.

 

이렇게 함으로써 비UI 스레드에서도 안전하게 RichTextBox를 업데이트할 수 있습니다.

이 코드를 사용하면 디버깅 및 로깅 용도로 RichTextBox를 편리하게 사용할 수 있습니다. 텍스트 추가와 자동 스크롤 기능을 통해 개발 및 테스트 과정에서 로그를 빠르게 확인할 수 있습니다.