본문 바로가기

Development/C#

DataGridView의 포멧과 정렬사용하기


DataGridView 정렬하기

DataGridView에서 정렬기능은 각 컬럼별로 설정이 가능하면 SortMode를 통해서 설정이 가능합니다.


정렬방법은 다음과 같습니다.

this.dataGridView1.Columns["컬럼명"].SortMode = DataGridViewColumnSortMode.Automatic;



정렬모드는 다음과 같이 3가지가 있습니다.

  • NotSortable : 정렬안함
  • Automatic : 자동정렬 (기본설정)
  • Programmatic : 수동정렬

정렬모드에서 Automatic으로 설정하면 헤더를 클릭시 자동으로 오름/내림 차순으로 정렬이 되어 상당히 편리합니다. 그러나 숫자에 천단위 표시기호가 들어있거나 금액단위(원, 달러) 등을 표시하는 경우 문자열로 비교를 하기에 생각하는 데로 정렬이 되지 않습니다.


예를 들어, (오름차순 기준) 

 A

500 

 B

1,000 

 C

30,000 

 D

20 

 E

4,000 


개발자 생각

 D

 20

 A

 500

 B

 1,000

 E

 4,000

 C

 30,000


실제 현상

 B

1,000 

 D

 20

 C

 30,000

 E

 4,000

 A

 500


그럼 이걸 어떻게 해야 할까요?

SortCompare 이벤트를 통해서 해결할 수 있습니다. 이벤트에서 해당하는 컬럼을 체크하여 컬럼의 값을 숫자로 바꿔 비교한 뒤 그 결과를 SortResult에 설정하면 됩니다. 다음의 코드를 보면 쉽게 이해가 갈 것입니다. 

private void dataGridView1_SortCompare(object sender, DataGridViewSortCompareEventArgs e)

{

if (!string.IsNullOrEmpty(e.CellValue1.ToString()) && !string.IsNullOrEmpty(e.CellValue2.ToString()))

{

double d1 = string.IsNullOrEmpty(e.CellValue1.ToString()) ? 0.0 : Convert.ToDouble(e.CellValue1.ToString().Replace(",", string.Empty));

double d2 = string.IsNullOrEmpty(e.CellValue2.ToString()) ? 0.0 : Convert.ToDouble(e.CellValue2.ToString().Replace(",", string.Empty));


if (d1 > d2)

{

e.SortResult = 1;

}

else if (d1 < d2)

{

e.SortResult = -1;

}

else

{

e.SortResult = 0;

}


e.Handled = true;

}

}

하지만 위의 방법은 데이터 바인딩을 사용하면 해당 이벤트가 작동되지 않습니다. MSDN에 보면 DataBinding을 하지 않거나 Virtual Mode가 false일 때만 발생된다고 나옵니다.(참조 : https://msdn.microsoft.com/en-us/library/system.windows.forms.datagridview.sortcompare(v=vs.110).aspx )

그럼 데이터 바인딩을 사용한다면 어떻게 해야 할까요? 

저는 여기서 많은 고민이 시작되었습니다. 열심히 구글링을 했지만 뚜렷한 해결책은 보이지 않았습니다. 한참을 고민하다가 번뜩 이 방법이 떠올랐습니다. '데이터 바인딩 원본은 숫자값만 가지고 있고 DataGridView에서 포멧을 활용하여 Display를 위 처럼 보여주면 어떨까?'하는 생각에 곧바로 시도를 했고, 생각했던 결과가 나왔습니다.

그렇다면 Display Format은 어떻게 사용하는 걸까요?

Display Format은 각 컬럼의 스타일에서 정의할 수 있습니다. 디자인 모드에서 본다면 다음과 같습니다.


해당 컬럼의 속성창에서 모양 탭을 보면 DefaultCellStyle이 있습니다. 그 스타일을 선택해서 들어가면 동작 탭에 Format이 보입니다. 그곳에서 포멧의 형식을 정의하면 됩니다. (참조 : https://msdn.microsoft.com/ko-kr/library/0c899ak8(v=vs.110).aspx)

 

위와 같은 Display 형식을 만들기 위해 다음과 같은 포멧형식을 입력하면

Format : #,##0

해당 컬럼의 값이 천단위 문자가 표시되어지는 것을 볼 수 있습니다. 


DataGridView의 정렬모드는 Automatic으로 설정한 뒤 실행해서 확인해보시면 정렬이 잘 되는것을 볼 수 있습니다.


'Development > C#' 카테고리의 다른 글

DataGridView의 헤더를 멀티로 만들어보자  (1) 2012.07.02
DataGridView헤더에 CheckBox를 달자  (1) 2012.06.19