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.

Параметру VirtualMode задается значение true.

-или-

DataSource не является null.

Примеры

В следующем примере кода показано, как использовать перегрузку метода в сценарии сортировки 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 события и вызвать этот метод с экземпляром класса, реализующего интерфейс в System.Collections.IComparer качестве параметра. В этом случае для свойства DataGridViewColumnSortMode.Programmatic обычно устанавливается значение DataGridViewColumn.SortMode , чтобы отключить автоматическую сортировку и оставить место для глифа сортировки. При сортировке по столбцам в режиме программной сортировки необходимо отобразить глиф сортировки DataGridViewColumnHeaderCell.SortGlyphDirection самостоятельно, задав свойство .

Этот метод работает только в том случае, DataSource если свойство не задано. При привязке DataGridView элемента управления к внешнему источнику данных необходимо использовать операции сортировки, предоставляемые этим источником данных. При предоставлении собственного источника данных путем реализации виртуального режима необходимо также самостоятельно обрабатывать операции сортировки.

При вызове этого метода для свойства автоматически устанавливается CurrentCell значение null.

См. также раздел

Применяется к

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 с помощью свойства .

Для столбцов со свойством SortModeDataGridViewColumnSortMode.Automatic, SortedColumn свойства и SortOrder задаются автоматически, и отображается соответствующий глиф сортировки. Для столбцов со свойством SortMode , для свойства DataGridViewColumnSortMode.Programmaticнеобходимо отобразить глиф сортировки самостоятельно через DataGridViewColumnHeaderCell.SortGlyphDirection свойство .

Операцию сортировки, используемую этим методом, можно настроить путем обработки SortCompare события . Это событие возникает только в том случае, DataSource если свойство не задано.

DataSource Если свойство задано, этот метод работает только для столбцов, привязанных к данным. Для столбцов, привязанных к данным, задано свойство DataGridViewColumn.DataPropertyName . Это приводит к тому, что DataGridViewColumn.IsDataBound свойство возвращает .true

Если элемент DataGridView управления содержит как привязанные, так и несвязанные столбцы, необходимо реализовать виртуальный режим для сохранения значений несвязанных столбцов при сортировке элемента управления по привязанным столбцам. Это можно сделать, присвоив свойству VirtualMode значение true и об обрабатывая CellValueNeeded событие. Если столбец доступен для редактирования, следует также обработать CellValuePushed событие . Дополнительные сведения о виртуальном режиме см. в разделе Практическое руководство. Реализация виртуального режима в Windows Forms элемента управления DataGridView. Сортировка по несвязанным столбцам, если элемент управления привязан к данным, не поддерживается.

См. также раздел

Применяется к