본문 바로가기
창고

C# 데이터그리드뷰 컬럼 헤더 클릭시 숫자 정렬 오류 수정하기 (DataGridView Column Header Negative number)

by 긍정왕수전노 2020. 3. 15.
반응형

안녕하세요. 긍정왕수전노입니다.

키움증권 OpenAPI를 이용해 C#으로 일종의 주식검색기 프로그램을 개발하던 중 데이터그리드뷰의 컬럼 헤더를 클릭하면 숫자, 특히 음수 정렬이 이상하게 되는 것을 발견하게 되었습니다.

"기울기Total"이라는 헤더를 클릭하면 보통 오름차순, 내림차순 정렬이 되는데 숫자를 절대값으로 인식해서 정렬을 하는 겁니다.

 

오름차순 정렬을 시킨건데 분명히... 0%보다도 작은 - 마이너스 값들이 가장 위에 행으로 가야 하는데...

양수가 나왔다가 음수가 나왔다가 뒤죽박죽입니다.

앞에 양수/음수 부호 떼고 절대값 순서로만 정렬이 되었습니다.


이것을 데이터그리드뷰에서 음수/양수 구분해서 정렬하기 위한 코드를 작성해봤습니다.

1) 데이터그리드뷰를 선택해서 ColumnHeaderMouseClick 이벤트를 생성해줍니다.

 

2) 아래처럼 소스코드를 작성합니다.

원리는 간단합니다. DataTable이나 DataGridView의 기본 Sort 기능으로는 음수 / 양수의 크기에 따른 오름차순, 내림차순 정렬이 되지 않습니다.

하지만 Dictionary의 Sort 기능은 양수음수를 구분합니다.!

그래서~ 아래처럼 코드를 작성했습니다.

        private void dataGridView_MainList_ColumnHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e)
        {
            Dictionary<int, double> dicTemp = new Dictionary<int, double>();
            foreach (DataRow dr in dtMainList.Rows)
            {
                dicTemp.Add(dtMainList.Rows.IndexOf(dr), Convert.ToDouble(dr["기울기Total"].ToString().Trim('%')));
            }

            var varDic = dicTemp.OrderBy(x => x.Value);
            DataTable dtTemp = dtMainList.Clone();
            foreach (var item in varDic)
            {
                DataRow drt = dtTemp.NewRow();
                drt.ItemArray = dtMainList.Rows[item.Key].ItemArray;
                dtTemp.Rows.Add(drt);
            }
            dtMainList = dtTemp.Copy();
            dataGridView_MainList.DataSource = dtMainList;
        }

- 정렬할 기준 열의 값들을 Dictionary에 채워넣습니다.

- Dictionary의 값들을 오름차순 정렬을 해줍니다. (OrderBy 메소드 이용)

- 새롭게 DataTable을 만들고, Dictionary의 값을 순차적으로 채워넣음

- DataGridView의 DataSource로 적용!

 

그럼 결과를 보시죠~

 

기울기Total 열의 값들이 오름차순으로 깔끔하게 정렬됐죠!!

반응형