VB :: Lecture & TIPs

[VB.NET] Datagridview Header 평균 / 합계 라인 (Last Row) 을 제외하고 정렬하기

안녕하세요? HappyBono 입니다.

.NET 에서 DataGridView 에 데이터를 출력한 뒤에 Header 를 클릭하여 데이터 정렬이 필요하신 경우, 별 설정 없이 데이터 정렬을 할 수 있는 기능이 있어 애용하지만, 간혹 “평균” 과 같은 정렬에는 적용이 되지 않아야 하는 행이 데이터에 존재하는 경우 곤란해집니다.

이러한 경우 사용하실 수 있는 방법이 바로 DataGridView 컨트롤 하위의 SortCompare 라는 이벤트인데요,

GridView 내 Header 를 클릭하여 정렬 기능을 이용하실 때,

DataGridView1.Columns(0).SortMode = DataGridViewColumnSortMode.Automatic 과 같이 정렬이 가능하도록 열 부분의 설정을 먼저 해 주시고, 평균과 같은 내용을 출력하실 때 해당 행의 Tag 속성에 구별할 수 있는 값을 입력해 두세요.

그리고 SortCompare 이벤트에 코딩을 하여 예외 처리를 해 주시면 됩니다.

그럼, 앱에 구현을 해 볼까요?
일단 Windows Forms App 형식의 새로운 프로젝트를 하나 생성하신 후,
Form 에 DataGridView 하나를 추가합니다.
그리고 다음 코드를 넣고 디버깅 해 보세요.

 

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        With DataGridView1
            Dim Average As Int32

            .Columns.Add("Time", "시간")
            .Columns.Add("Temperature", "온도")
            .Columns(0).SortMode = DataGridViewColumnSortMode.Automatic
            .Columns(1).SortMode = DataGridViewColumnSortMode.Automatic
            .AllowUserToAddRows = False
            .Rows.Add({"01:00", 30})
            .Rows.Add({"04:00", 28})
            .Rows.Add({"07:00", 30})
            .Rows.Add({"10:00", 32})
            .Rows.Add({"13:00", 33})
            .Rows.Add({"16:00", 33})
            .Rows.Add({"19:00", 32})
            .Rows.Add({"22:00", 30})

            Average = (From row As DataGridViewRow In DataGridView1.Rows
            Where row.Cells(1).FormattedValue.ToString() <> String.Empty
            Select Convert.ToInt32(row.Cells(1).FormattedValue)).Average().ToString()

            .Rows.Add({"평균", Average})
            .Rows(.Rows.Count - 1).Tag = "Average"
        End With
    End Sub

    Private Sub DataGridView1_SortCompare(sender As Object, e As DataGridViewSortCompareEventArgs) Handles DataGridView1.SortCompare
        If (DataGridView1.Rows(e.RowIndex1).Tag = "Average") Then
            e.SortResult = If(DataGridView1.SortOrder = SortOrder.Ascending, -1, 1)
        ElseIf (DataGridView1.Rows(e.RowIndex2).Tag = "Average") Then
            e.SortResult = If(DataGridView1.SortOrder = SortOrder.Ascending, -1, 1)
        Else
            e.SortResult = If(DataGridView1.SortOrder = SortOrder.Ascending, If(CSng(e.CellValue1) > CSng(e.CellValue2), 1, -1), If(CSng(e.CellValue1) <= CSng(e.CellValue2), -1, 1))
        End If

        e.Handled = True
    End Sub

 

이러한 방식으로, 평균이나 통계 항목을 제외한 나머지 행들에 한해서만 정렬되는 것을 확인하실 수 있습니다.

 

 

 

고맙습니다.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google+ photo

You are commenting using your Google+ account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s