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;
}
}
그럼 데이터 바인딩을 사용한다면 어떻게 해야 할까요?
그렇다면 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 |