즐겁게 개발을...

개발보다 게임이 더 많이 올라오는 것 같은...

개발/C# + DevExpress

DevExpress Listbox 항목 별 색깔 바꾸기

다물칸 2023. 5. 31. 16:39
728x90

오랜만에 개발 관련 글을 작성하는 것 같네요. 

Listbox Control 사용처는 저만 그런지 모르겠지만 로그를 볼 때 사용하게 되는데 가끔 고객들이 로그레벨에 따라 색상 구분해주세요. 라는 요청을 받고 무시하곤 했습니다만, 이번에 한번 만들어보았습니다. 

결과

 

코드에 주석을 달았으니, 맘껏 응용해보아요. ^^

 

// 준비작업: 폼에 ListBox를 올려두고 이름을 LstLog로 변경합니다.

// Listbox 콘트롤 아이템에 넣을 Object입니다. 로그레벨 구분을 위함.
private class LogStruct
{
    public LOGGER_LEVEL logLevel { get; set; }
    public string Message { get; set; }
    public LogStruct(LOGGER_LEVEL logLevel, string message)
    {
        this.logLevel = logLevel;
        Message = message;
    }
}

// 로그레벨 상수입니다. 
// NLog.Loglevel 이 상수가 아니라 클래스라서 아규먼트로 넣어지질 않네요.
private enum LOGGER_LEVEL
{
    Info,
    Error,
    Debug
}

// 자동스크롤 여부 (설정으로 빼시면 됩니다.)
private bool AutoScroll = false;
private void AddLog(string message, LOGGER_LEVEL LogLevel = LOGGER_LEVEL.Info)
{
    Invoke(new Action(() =>
    {
        string totMsg = string.Format("{0} : {1}", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), message);
        LogStruct logStruct = new LogStruct(LogLevel, totMsg);

        LstLog.Items.Add(logStruct);
        if (AutoScroll) LstLog.SelectedIndex = LstLog.ItemCount - 1;

        // 100건이 넘어가면 과거 아이템을 삭제한다. 
        if (LstLog.Items.Count > 100)
        {
            LstLog.Items.RemoveAt(0);
        }

        switch (LogLevel)
        {
            case LOGGER_LEVEL.Info:
                logger.Info(totMsg);
                break;
            case LOGGER_LEVEL.Error:
                logger.Error(totMsg);
                break;
            case LOGGER_LEVEL.Debug:
                logger.Debug(totMsg);
                break;
            default:
                break;
        }
    }));
}

// 로그레벨에 따라 전경색(글자색)을 분기하여 처리합니다.
private void LstLog_DrawItem(object sender, ListBoxDrawItemEventArgs e)
{
    LogStruct logStruct = (LogStruct)e.Item;
    switch (logStruct.logLevel)
    {
        case LOGGER_LEVEL.Info:
            e.Appearance.ForeColor = Color.Black;
            break;
        case LOGGER_LEVEL.Error:
            e.Appearance.ForeColor = Color.Red;
            break;
        case LOGGER_LEVEL.Debug:
            e.Appearance.ForeColor = Color.DarkGray;
            break;
        default:
            break;
    }
}

// 아이템이 오브젝트이기 때문에 표시할 텍스트를 바꿔서 보여줍니다.
private void LstLog_CustomItemDisplayText(object sender, CustomItemDisplayTextEventArgs e)
{
    LogStruct logStruct = (LogStruct)e.Item;
    e.DisplayText = logStruct.Message;
}

 

반응형