즐겁게 개발을...

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

개발/C#

바닐라 ListBox 항목 별 색깔 바꾸기

다물칸 2023. 8. 17. 10:58
728x90
반응형

DevExpress는 다 좋은데 패키징하면 파일이 엄청 커져서 뷁입니다. 그래서 기본 콘트롤로 개발하다보니 이 기능이 필요해서 만들어봤습니다. 

 

대충 이런 모양... 

ListBox에 넣는 Item은 DataTable을 데이터 소스로 해서 넣어봤습니다. 일반 클래스 형태로 하셔도 됩니다. 

현재 아이템에 어떤 기준으로 색상을 넣을 건지의 분기만 가능하면 되요. 물론 스트링으로 넣고 스트링 파싱해서 하셔도 되겠죠? 

 

자세한 내용은 코드 내 주석으로 대신합니다. 

DataTable dtLog;

private void Frmmain_Load(object sender, EventArgs e) 
{
    dtLog = new DataTable();
    // 흠.. Datatable Column생성하는 건데 궂이 DevExpressHelper는 아니군요. ㅋㅋ
    dtLog.Columns.Add(DevExpressHelper.MakeDataColumn("loglevel", typeof(LOGGER_LEVEL), "Log Level"));
    dtLog.Columns.Add(DevExpressHelper.MakeDataColumn("message", typeof(string), "Message"));
    LstBox.DataSource = dtLog;
    LstBox.DisplayMember = "message";
    LstBox.ItemHeight = 22;
}

// 로그레벨 상수입니다. 
private enum LOGGER_LEVEL
{
    Info,
    Error,
    Debug
}

// 로그추가 함수
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);

        DataRow dr = dtLog.NewRow();
        dr["loglevel"] = LogLevel;
        dr["message"] = totMsg;
        dtLog.Rows.Add(dr);

        if (AutoScroll) LstBox.SelectedIndex = LstBox.Items.Count - 1;

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

        // 이건 파일로그 처리하는 부분입니다. 저는 nLog사용했어요.
        switch (LogLevel)
        {
            case LOGGER_LEVEL.Info:
                GClass.logger.Info(totMsg);
                break;
            case LOGGER_LEVEL.Error:
                GClass.logger.Error(totMsg);
                break;
            case LOGGER_LEVEL.Debug:
                GClass.logger.Debug(totMsg);
                break;
            default:
                break;
        }
    }));
}

// 실제 색상을 그려주는 이벤트 함수입니다. 
private void LstBox_DrawItem(object sender, DrawItemEventArgs e)
{
    if (LstBox.Items.Count == 0) return;
    DataRowView dr = (DataRowView)LstBox.Items[e.Index];

    e.DrawBackground(); // 위에 스크린샷에 선택 시 배경을 넣지 않으려면 주석처리
    Color ForeColor = Color.Black;

    switch ((LOGGER_LEVEL)dr["loglevel"])
    {
        case LOGGER_LEVEL.Info:
            ForeColor = Color.Black;
            break;
        case LOGGER_LEVEL.Error:
            ForeColor = Color.Red;
            break;
        case LOGGER_LEVEL.Debug:
            ForeColor = Color.Blue;
            break;
        default:
            ForeColor = Color.Black;
            break;
    }

    e.Graphics.DrawString(dr["message"].ToString(), e.Font, new SolidBrush(ForeColor), e.Bounds, StringFormat.GenericDefault);
    e.DrawFocusRectangle(); // 위에 스크린샷에 선택 시 배경을 넣지 않으려면 주석처리
}

 

 

DevExpress Listbox에서는 다음 글에서 참조해주세요. 

 

DevExpress Listbox 항목 별 색깔 바꾸기

오랜만에 개발 관련 글을 작성하는 것 같네요. Listbox Control 사용처는 저만 그런지 모르겠지만 로그를 볼 때 사용하게 되는데 가끔 고객들이 로그레벨에 따라 색상 구분해주세요. 라는 요청을 받

endev.tistory.com

 

반응형