VB.NET 2008/VB - 데이터 그리드 뷰

DataGridView - 열 정렬 모드

본클라쓰 2011. 4. 26. 11:16

DataGridView 열에는 세 가지 정렬 모드가 있다.


각 열의 정렬 모드는 열의 SortMode 속성을 통해 지정할 수 있으며 이 속성은 다음 DataGridViewColumnSortMode 열거형 값 중 하나로 설정할 수 있다.



1. Automatic


텍스트 상자 열의 기본값이다. 열 머리글을 선택에 사용하지 않는 한 열 머리글을 클릭하면 DataGridView가 이 열을 기준으로 자동 정렬되고 정렬 순서를 나타내는 문자가 표시된다.


2. NotSortable


텍스트 상자가 아닌 열의 기본값이다. 이 열을 프로그래밍 방식으로 정렬할 수도 있지만 이 열은 정렬을 위한 열이 아니므로 정렬 문자에 대한 공간이 예약되어 있지 않다.


3. Programmatic


이 열은 프로그래밍 방식으로 정렬할 수 있으며 정렬 문자에 대한 공간이 예약되어 있다.



열의 의미에 따라 정렬될 수 있는 값이 포함되어 있는 경우에는 열의 정렬 모드를 기본값인 NotSortable에서 다른 값으로 변경할 수 있다. 예를 들어, 항목 상태를 나타내는 번호를 포함하는 데이터베이스 열이 있는 경우 이미지 열을 데이터베이스 열에 바인딩하여 이러한 번호를 해당 아이콘으로 표시할 수 있다. 그런 다음 DataGridView.CellFormatting 이벤트 처리기에서 숫자 셀 값을 이미지 표시 값으로 변경할 수 있다. 이 경우 SortMode 속성을 Automatic으로 설정하면 사용자가 열을 정렬할 수 있다.


자동 정렬을 사용하면 번호에 해당하는 상태에 자연 스퀀스가 없더라도 사용자가 상태를 동일한 항목을 그룹화할 수 있다. 확인란 열에서 상태가 동일한 항목을 그룹화하는 데에도 자동 정렬이 유용하다.


SortMode 설정에 관계없이 열 값을 기준으로 DataGridView를 프로그래밍 방식으로 정렬할 수 있다. 프로그래밍 정렬은 정렬에 대해 사용자 지정 UI를 제공하거나 사용자 지정 정렬을 구현하려는 경우에 유용하다. 사용자 정렬 UI는 열 머리글 선택을 사용하도록 DataGridView 선택 모드를 설정하는 경우 등에 유용하다.




프로그래밍 정렬


Sort 메서드를 호출하여 DataGridView를 프로그래밍 방식으로 정렬할 수 있다.


Sort 메서드의 Sort 오버로드는 DataGridViewColumn 및 ListSortDirection 열거형 값을 매개 변수로 사용한다. 의미에 따라 정렬될 수 있는 값이 있는 열을 기준으로 정렬하려고 하지만 자동 정렬을 구성하지 않으려는 경우 이 오버로드가 유용하다. 이 오버로드를 호출하고 SortMode 속성 값이 DataGridViewColumnSortMode.Automatic인 열에 전달하면 SortedColumn 및 SortOrder 속성이 자동으로 설정되고 적절한 정렬 문자가 열 머리글에 나타난다.




사용자 지정 정렬


Sort 메서드의 Sort 오버로드를 사용하거나 SortCompare 이벤트를 처리하여 DataGridView를 사용자 지정할 수 있다.


Sort메서드 오버로드는 IComparer 인터페이스를 매개 변수로 구현하는 클래스 인스턴스를 사용한다. 이 오버로드는 열 값에 자연 정렬 순서가 없거나 자연 정렬 순서가 부적합한 경우처럼 사용자 지정 정렬을 제공하려는 경우에 유용하다. 이 경우 자동 정렬을 사용할 수 없지만 사용자가 열 머리글을 클릭하여 정렬하도록 할 수는 있다.



열 정렬 모드를 설정할 때는 DataGridView 컨트롤에서 열의 SortMode 속성 값은 열의 정렬 동작을 결정한다.


Me.dataGridView1.Columns("Priority").SortMode = DataGridViewColumnSortMode.Automatic



DataGridView 컨트롤을 사용하여 자동 정렬을 수행할 수 있지만 필요에 따라 정렬 작업을 사용자 지정할 수 있다. 예를 들어, 프로그래밍 정렬을 사용하여 대체 UI를 만들 수 있다. 또는 여러 열 정렬과 같은 유연성이 뛰어난 정렬 작업을 위해 SortCompare 이벤트를 처리하거나 Sort 메서드의 Sort 오버로드를 호출할 수 있다.


다음 코드는 SortOrder 및 SortedColumn 속성을 사용하여 정렬 방향을 결정하고 SortGlyphDirection 속성을 사용하여 정렬 문자 모양을 수동으로 설정하는 프로그래밍 정렬을 보여준다.


' Check which column is selected, otherwise set NewColumn to Nothing.

Dim newColumn As DataGridViewColumn


If dataGridView1.Columns.GetColumnCount(DataGridViewElementStates.Selected) = 1 Then

    newColumn = dataGridView1.SelectedColumns(0)

Else

    newColumn = Nothing

End If


Dim oldColumn As DataGridViewColumn = dataGridView1.SortedColumn

Dim direction As ListSortDirection


' If oldColumn is null, then the DataGridView is not currently sorted.

If oldColumn IsNot Nothing Then

    ' Sort the same column again, reversing the SortOrder.

    If oldColumn Is newColumn AndAlso dataGridView1.SortOrder = SortOrder.Ascending Then

        direction = ListSortDirection.Descending

    Else

        ' Sort a new column and remove the old SortGlyph.

        direction = ListSortDirection.Ascending

        oldColumn.HeaderCell.SortGlyphDirection = SortOrder.None

    End If

Else

    direction = ListSortDirection.Ascending

End If


' If no column has been selected, display an error dialog box.

If newColumn Is Nothing Then

    MessageBox.Show("Select a single column and try again.", "Error: Invalid Selection", MessageBoxButtons.OK, _ MessageBoxIcon.Error)

Else

    dataGridView1.Sort(newColumn, direction)

    If direction = ListSortDirection.Ascending Then

        newColumn.HeaderCell.SortGlyphDirection = SortOrder.Ascending

    Else newColumn.HeaderCell.SortGlyphDirection = SortOrder.Descending

    End If

End If




SortCompare 이벤트 처리기를 사용한 사용자 지정 정렬


Private Sub DataGridView1_SortCompare( ByVal sender As Object, _

        ByVal e As DataGridViewSortCompareEventArgs) _ Handles DataGridView1.SortCompare


    ' Try to sort based on the contents of the cell in the current column.

    e.SortResult = System.String.Compare(e.CellValue1.ToString(), e.CellValue2.ToString())


    ' If the cells are equal, sort based on the ID column.

    If (e.SortResult = 0) AndAlso Not (e.Column.Name = "ID") Then

        e.SortResult = System.String.Compare(DataGridView1.Rows(e.RowIndex1).Cells("ID").Value.ToString(), _   DataGridView1.Rows(e.RowIndex2).Cells("ID").Value.ToString())

    End If


    e.Handled = True

End Sub

 


이 이벤트는 DataSource 속성이 설정되지 않고 VirtureMode 속성 값이 false인 경우에만 발생한다.


이 이벤트는 정렬되고 있는 열에 있는 셀의 쌍을 비교한다. 이 이벤트는 SortMode 속성 값이 Automatic인 열의 머리글을 클릭하거나, Sort 오버로드를 호출할 때만 발생하다. 이 이벤트가 SortMode 속성 값이 Programmatic인 열에 대해 발생하는 경우, DataGridViewColumnHeaderCell.SortGlyphDirection 속성을 통해 정렬 문자 모양을 직접 표시해야 한다.