C# Datagridview column sort 후 다시 datasoure 바인딩 질문

안녕하세요 C# 독학중인 초급개발자입니다!!

제가 자주 사용하는 Datagridview 에서 예상치 못한 처리가 일어나서 해결하고자 올려봅니다!

내용을 정리하자면

  1. DataTable resultDt = SetData(); <---- 데이터를 DB에서 가져와 정리합니다.
  2. dgv.DataSource = resultDt; ← dgv 에 바인딩
  3. 특정 cell값을 확인 후 색 강조
            for (int i = dgv.Rows.Count - 1; i >= 0; i--)
            {
                if (dgv.Rows[i].Cells["sub_id"].Value == "9999")
                    dgv.Rows[i].Cells["product"].Style.BackColor = Color.Blue;
                else
                    dgv.Rows[i].Cells["product"].Style.BackColor = Color.White;
            }
  1. ColumnHeaderDoubleClick 정렬 (아무 컬럼이나)
                    dgvProduct.Sort(
                        dgvProduct.Columns["up_lv"],
                        ListSortDirection.Ascending
                    );
  1. 그 후 다시 조회한다고 1~3번 기능 수행
  2. 문제 현상 발생
    → 실제 처리할 때 for문을 통해 row 하나씩 값을 확인해서 처리하는데 디버그 중 값은 정확히 맞습니다. 하지만 출력 후 색상 처리된 결과를 보면 뒤죽박죽입니다.

여기서 제가 몇 가지를 예측을 해보면 dgv.DataSource 바인딩 후 sort 기능이 아직 유효함으로 자동으로 정렬 처리가 되어 순서가 바뀜, 하지만 디버그 중 에는 바뀌지 않은 순서로 처리 → 바뀐 순서로 적용 뭐 이렇지 않을까 생각합니다.

이런 경우를 이미 아시거나 Datagridview 설정을 초기화하는 방법을 아시는 분은 도움을 주시면 감사하겠습니다…!

기본적인 초기화는 전부 다해봤습니다
Rows.Clear, Columns.Clear, dgv.SortMode = DataGridViewColumnSortMode.NotSortable; 등등

2 Likes

@cookie 재현될 수 있는 소스코드를 제공해주시면 훨씬 수월하게 문제를 해결하 실 수 있습니다.
샘플 프로젝트를 GitHub Repository 또는 .zip 파일을 통해 제공해주시면 가장 좋고요.

GitHub 사용법은 시간이 될 때 꼭 알아보시면 좋겠습니다!!

GPT 4.0 답변 한번 남겨두겠습니다.


DataGridView의 데이터 소스를 다시 바인딩하고 이전 정렬 상태가 그대로 유지되는 것으로 인해 색상이 잘못 적용되는 문제를 겪고 계신 것 같습니다. 정렬 후 셀의 값을 기준으로 색상을 변경할 때, 실제 데이터와 DataGridView의 표시 순서가 맞지 않을 수 있기 때문입니다.

문제를 해결하기 위해 다음과 같은 방법을 시도해 볼 수 있습니다:

  1. 정렬 상태 초기화: 데이터를 다시 바인딩하기 전에 DataGridView의 정렬 상태를 초기화할 수 있습니다. 이것은 Sort 속성을 초기화하는 것과는 다릅니다. DataGridViewSortedColumnSortOrder 속성을 사용하여 현재 정렬 상태를 확인하고, DataGridView.Sort 메서드를 사용하여 정렬을 초기화할 수 있습니다.

    if (dgvProduct.SortedColumn != null)
    {
        dgvProduct.Sort(dgvProduct.SortedColumn, ListSortDirection.Ascending); // 정렬을 초기 상태로 설정
        dgvProduct.ClearSorting(); // 정렬 상태를 완전히 제거
    }
    
  2. 색상 강조 로직 변경: 데이터 소스에서 직접 조건을 검사하여 결과를 데이터 테이블에 추가하고, DataGridView에 새로운 스타일을 적용하기 전에 다시 바인딩합니다.

  3. 컬럼의 SortMode 변경: 모든 컬럼의 SortModeNotSortable로 설정하여 사용자가 수동으로 정렬하지 못하도록 할 수 있습니다. 이렇게 하면 데이터 소스를 다시 바인딩할 때 자동으로 정렬되는 것을 방지할 수 있습니다.

    foreach (DataGridViewColumn column in dgvProduct.Columns)
    {
        column.SortMode = DataGridViewColumnSortMode.NotSortable;
    }
    
  4. 새 데이터 바인딩 전 정렬 상태 확인: 색상을 변경하기 전에 DataGridView의 현재 정렬 상태를 확인하고, 색상을 적용한 후에 같은 정렬 상태로 다시 정렬해 주는 방법도 고려해 볼 수 있습니다.

    또한 , 만약 정렬이 문제의 원인이라고 확신할 수 없다면, DataGridViewCellFormatting 이벤트를 사용하여 색상을 적용하는 것도 하나의 방법입니다. 이 이벤트는 각 셀이 화면에 그려질 때 호출되며, 여기서 조건에 따라 셀의 스타일을 동적으로 변경할 수 있습니다.

    private void dgvProduct_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
    {
        if (e.ColumnIndex == dgvProduct.Columns["sub_id"].Index)
        {
            string value = dgvProduct.Rows[e.RowIndex].Cells["sub_id"].Value as string;
            if (value == "9999")
                e.CellStyle.BackColor = Color.Blue;
            else
                e.CellStyle.BackColor = Color.White;
        }
    }
    

    CellFormatting 이벤트를 사용하면 데이터가 다시 로드되거나 정렬될 때마다 자동으로 색상이 올바르게 적용됩니다. 이 방법을 사용하면 데이터를 로드하거나 다시 정렬할 때마다 색상을 직접 적용하는 추가 작업 없이 일관된 색상 적용을 보장할 수 있습니다.

2 Likes

감사합니다

2 Likes