다음을 통해 공유


DataGridView.Sort 메서드

정의

DataGridView 컨트롤의 내용을 정렬합니다.

오버로드

Sort(IComparer)

DataGridView 인터페이스의 구현을 사용하여 IComparer 컨트롤의 내용을 정렬합니다.

Sort(DataGridViewColumn, ListSortDirection)

지정된 열의 내용을 기준으로 DataGridView 컨트롤의 내용을 오름차순이나 내림차순으로 정렬합니다.

Sort(IComparer)

DataGridView 인터페이스의 구현을 사용하여 IComparer 컨트롤의 내용을 정렬합니다.

public:
 virtual void Sort(System::Collections::IComparer ^ comparer);
public virtual void Sort (System.Collections.IComparer comparer);
abstract member Sort : System.Collections.IComparer -> unit
override this.Sort : System.Collections.IComparer -> unit
Public Overridable Sub Sort (comparer As IComparer)

매개 변수

comparer
IComparer

사용자 지정 정렬 작업을 수행하는 IComparer의 구현입니다.

예외

comparer이(가) null인 경우

VirtualModetrue로 설정됩니다.

또는

DataSourcenull가 아닙니다.

예제

다음 코드 예제에서는 여러 열 정렬 시나리오에서 메서드 오버로드를 사용하는 Sort 방법을 보여 줍니다. 이 예제에서 인터페이스는 IComparer 클래스에서 RowComparer 구현됩니다.

private void Button1_Click( object sender, EventArgs e )
{
    if ( RadioButton1.Checked == true )
    {
        DataGridView1.Sort( new RowComparer( SortOrder.Ascending ) );
    }
    else if ( RadioButton2.Checked == true )
    {
        DataGridView1.Sort( new RowComparer( SortOrder.Descending ) );
    }
}

private class RowComparer : System.Collections.IComparer
{
    private static int sortOrderModifier = 1;

    public RowComparer(SortOrder sortOrder)
    {
        if (sortOrder == SortOrder.Descending)
        {
            sortOrderModifier = -1;
        }
        else if (sortOrder == SortOrder.Ascending)
        {
            sortOrderModifier = 1;
        }
    }

    public int Compare(object x, object y)
    {
        DataGridViewRow DataGridViewRow1 = (DataGridViewRow)x;
        DataGridViewRow DataGridViewRow2 = (DataGridViewRow)y;

        // Try to sort based on the Last Name column.
        int CompareResult = System.String.Compare(
            DataGridViewRow1.Cells[1].Value.ToString(),
            DataGridViewRow2.Cells[1].Value.ToString());

        // If the Last Names are equal, sort based on the First Name.
        if ( CompareResult == 0 )
        {
            CompareResult = System.String.Compare(
                DataGridViewRow1.Cells[0].Value.ToString(),
                DataGridViewRow2.Cells[0].Value.ToString());
        }
        return CompareResult * sortOrderModifier;
    }
}
Private Sub Button1_Click(ByVal sender As Object, ByVal e As EventArgs) _
Handles Button1.Click
    If RadioButton1.Checked = True Then
        DataGridView1.Sort(New RowComparer(SortOrder.Ascending))
    ElseIf RadioButton2.Checked = True Then
        DataGridView1.Sort(New RowComparer(SortOrder.Descending))
    End If
End Sub

Private Class RowComparer
    Implements System.Collections.IComparer

    Private sortOrderModifier As Integer = 1

    Public Sub New(ByVal sortOrder As SortOrder)
        If sortOrder = sortOrder.Descending Then
            sortOrderModifier = -1
        ElseIf sortOrder = sortOrder.Ascending Then

            sortOrderModifier = 1
        End If
    End Sub

    Public Function Compare(ByVal x As Object, ByVal y As Object) As Integer _
        Implements System.Collections.IComparer.Compare

        Dim DataGridViewRow1 As DataGridViewRow = CType(x, DataGridViewRow)
        Dim DataGridViewRow2 As DataGridViewRow = CType(y, DataGridViewRow)

        ' Try to sort based on the Last Name column.
        Dim CompareResult As Integer = System.String.Compare( _
            DataGridViewRow1.Cells(1).Value.ToString(), _
            DataGridViewRow2.Cells(1).Value.ToString())

        ' If the Last Names are equal, sort based on the First Name.
        If CompareResult = 0 Then
            CompareResult = System.String.Compare( _
                DataGridViewRow1.Cells(0).Value.ToString(), _
                DataGridViewRow2.Cells(0).Value.ToString())
        End If
        Return CompareResult * sortOrderModifier
    End Function
End Class

설명

이 메서드를 사용하면 클래스의 정렬 기능을 고급으로 사용자 지정할 수 DataGridView 있습니다. 고도로 사용자 지정된 정렬 작업을 구현하기 위해 이벤트에 대한 ColumnHeaderMouseClick 이벤트 처리기를 작성하고 인터페이스를 매개 변수로 구현하는 클래스의 instance 사용하여 이 메서드를 호출할 System.Collections.IComparer 수 있습니다. 이 경우 일반적으로 DataGridViewColumn.SortMode 설정 합니다 속성 DataGridViewColumnSortMode.Programmatic 자동 정렬을 사용 하지 않도록 설정 하 고 정렬 문자 모양에 대 한 공간을 둡니다. 프로그래밍 방식 정렬 모드로 설정된 열을 기준으로 정렬하는 경우 속성을 설정 DataGridViewColumnHeaderCell.SortGlyphDirection 하여 정렬 문자 모양을 직접 표시해야 합니다.

이 메서드는 속성이 DataSource 설정되지 않은 경우에만 작동합니다. 컨트롤을 DataGridView 외부 데이터 원본에 바인딩하는 경우 해당 데이터 원본에서 제공하는 정렬 작업을 사용해야 합니다. 가상 모드를 구현하여 사용자 고유의 데이터 원본을 제공하는 경우 정렬 작업도 직접 처리해야 합니다.

이 메서드를 호출하면 속성null이 자동으로 로 CurrentCell 설정됩니다.

추가 정보

적용 대상

Sort(DataGridViewColumn, ListSortDirection)

지정된 열의 내용을 기준으로 DataGridView 컨트롤의 내용을 오름차순이나 내림차순으로 정렬합니다.

public:
 virtual void Sort(System::Windows::Forms::DataGridViewColumn ^ dataGridViewColumn, System::ComponentModel::ListSortDirection direction);
public virtual void Sort (System.Windows.Forms.DataGridViewColumn dataGridViewColumn, System.ComponentModel.ListSortDirection direction);
abstract member Sort : System.Windows.Forms.DataGridViewColumn * System.ComponentModel.ListSortDirection -> unit
override this.Sort : System.Windows.Forms.DataGridViewColumn * System.ComponentModel.ListSortDirection -> unit
Public Overridable Sub Sort (dataGridViewColumn As DataGridViewColumn, direction As ListSortDirection)

매개 변수

dataGridViewColumn
DataGridViewColumn

DataGridView의 내용을 정렬할 기준이 되는 열입니다.

direction
ListSortDirection

ListSortDirection 값 중 하나입니다.

예외

지정된 열이 이 DataGridView의 일부가 아닌 경우

또는

DataSource 속성이 설정되었으며 지정된 열의 IsDataBound 속성이 false를 반환합니다.

dataGridViewColumn이(가) null인 경우

VirtualMode 속성이 true 로 설정되었으며 지정된 열의 IsDataBound 속성이 false를 반환합니다.

또는

DataSource 속성에 의해 지정된 개체가 IBindingList 인터페이스를 구현하지 않는 경우

또는

DataSource 속성에 의해 지정된 개체에서 SupportsSorting 속성 값이 false인 경우

예제

다음 코드 예제를 사용 Sort 하는 방법에 설명 합니다 프로그래밍 방식으로 정렬 합니다.

private void sortButton_Click(object sender, System.EventArgs e)
{
    // Check which column is selected, otherwise set NewColumn to null.
    DataGridViewColumn newColumn =
        dataGridView1.Columns.GetColumnCount(
        DataGridViewElementStates.Selected) == 1 ?
        dataGridView1.SelectedColumns[0] : null;

    DataGridViewColumn oldColumn = dataGridView1.SortedColumn;
    ListSortDirection direction;

    // If oldColumn is null, then the DataGridView is not currently sorted.
    if (oldColumn != null)
    {
        // Sort the same column again, reversing the SortOrder.
        if (oldColumn == newColumn &&
            dataGridView1.SortOrder == SortOrder.Ascending)
        {
            direction = ListSortDirection.Descending;
        }
        else
        {
            // Sort a new column and remove the old SortGlyph.
            direction = ListSortDirection.Ascending;
            oldColumn.HeaderCell.SortGlyphDirection = SortOrder.None;
        }
    }
    else
    {
        direction = ListSortDirection.Ascending;
    }

    // If no column has been selected, display an error dialog  box.
    if (newColumn == null)
    {
        MessageBox.Show("Select a single column and try again.",
            "Error: Invalid Selection", MessageBoxButtons.OK,
            MessageBoxIcon.Error);
    }
    else
    {
        dataGridView1.Sort(newColumn, direction);
        newColumn.HeaderCell.SortGlyphDirection =
            direction == ListSortDirection.Ascending ?
            SortOrder.Ascending : SortOrder.Descending;
    }
}
Private Sub SortButton_Click(ByVal sender As Object, _
    ByVal e As EventArgs) Handles sortButton.Click

    ' 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

End Sub

설명

이 메서드는 지정된 열의 값을 비교하여 의 DataGridView 내용을 정렬합니다. 기본적으로 정렬 작업은 메서드를 Compare 사용하여 속성을 사용하여 열의 셀 쌍을 DataGridViewCell.Value 비교합니다.

속성이 로 설정된 DataGridViewColumnSortMode.Automatic열의 SortModeSortedColumn 경우 및 SortOrder 속성이 자동으로 설정되고 적절한 정렬 문자 모양이 표시됩니다. 속성이 로 설정된 DataGridViewColumnSortMode.Programmatic열의 SortMode 경우 속성을 통해 DataGridViewColumnHeaderCell.SortGlyphDirection 정렬 문자 모양을 직접 표시해야 합니다.

이벤트를 처리하여 이 메서드에서 사용하는 정렬 작업을 사용자 지정할 수 있습니다 SortCompare . 이 이벤트는 속성이 DataSource 설정되지 않은 경우에만 발생합니다.

속성이 DataSource 설정된 경우 이 메서드는 데이터 바인딩된 열에 대해서만 작동합니다. 데이터 바인딩된 열에는 해당 속성 집합이 DataGridViewColumn.DataPropertyName 있습니다. 이렇게 하면 속성이 를 DataGridViewColumn.IsDataBound 반환 true합니다.

DataGridView 컨트롤에 바인딩된 열과 언바운드 열이 모두 포함된 경우 컨트롤이 바인딩된 열로 정렬될 때 바인딩되지 않은 열의 값을 유지하기 위해 가상 모드를 구현해야 합니다. 속성을 로 설정하고 VirtualMode 이벤트를 처리하여 이 작업을 수행할 수 있습니다CellValueNeeded.true 열을 편집할 수 있는 경우 이벤트도 처리 CellValuePushed 해야 합니다. 가상 모드에 대한 자세한 내용은 방법: Windows Forms DataGridView 컨트롤에서 가상 모드 구현을 참조하세요. 컨트롤이 데이터 바인딩된 경우 바인딩되지 않은 열을 기준으로 정렬하는 것은 지원되지 않습니다.

추가 정보

적용 대상