DataGridView.Sort Metoda

Definicja

Sortuje zawartość kontrolki DataGridView .

Przeciążenia

Sort(IComparer)

Sortuje zawartość DataGridView kontrolki przy użyciu implementacji interfejsu IComparer .

Sort(DataGridViewColumn, ListSortDirection)

Sortuje zawartość kontrolki DataGridView w kolejności rosnącej lub malejącej na podstawie zawartości określonej kolumny.

Sort(IComparer)

Sortuje zawartość DataGridView kontrolki przy użyciu implementacji interfejsu 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)

Parametry

comparer
IComparer

Implementacja IComparer tej funkcji wykonuje niestandardową operację sortowania.

Wyjątki

comparer to null.

VirtualMode jest ustawiona na truewartość .

-lub-

DataSource nie nulljest .

Przykłady

W poniższym przykładzie kodu pokazano, jak używać przeciążenia metody w scenariuszu Sort sortowania w wielu kolumnach. W tym przykładzie IComparerRowComparer interfejs jest implementowany w klasie .

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

Uwagi

Ta metoda umożliwia zaawansowane dostosowywanie funkcji sortowania DataGridView klasy. Aby zaimplementować wysoce dostosowaną operację sortowania, można napisać procedurę obsługi zdarzeń dla ColumnHeaderMouseClick zdarzenia i wywołać tę metodę przy użyciu wystąpienia klasy, która implementuje System.Collections.IComparer interfejs jako parametr. W takim przypadku właściwość jest zwykle ustawiana DataGridViewColumn.SortMode tak, aby DataGridViewColumnSortMode.Programmatic wyłączyć automatyczne sortowanie i pozostawić miejsce na glif sortowania. Podczas sortowania według kolumn ustawionych na tryb sortowania programowego należy samodzielnie wyświetlić sortowanie, ustawiając DataGridViewColumnHeaderCell.SortGlyphDirection właściwość .

Ta metoda działa tylko wtedy, gdy właściwość nie jest ustawiona DataSource . Po powiązaniu kontrolki DataGridView z zewnętrznym źródłem danych należy użyć operacji sortowania dostarczonych przez to źródło danych. Po podaniu własnego źródła danych przez zaimplementowanie trybu wirtualnego należy również samodzielnie obsługiwać operacje sortowania.

Wywołanie tej metody automatycznie ustawia CurrentCell właściwość na null.

Zobacz też

Dotyczy

Sort(DataGridViewColumn, ListSortDirection)

Sortuje zawartość kontrolki DataGridView w kolejności rosnącej lub malejącej na podstawie zawartości określonej kolumny.

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)

Parametry

dataGridViewColumn
DataGridViewColumn

Kolumna, według której należy posortować zawartość elementu DataGridView.

direction
ListSortDirection

Jedna z ListSortDirection wartości.

Wyjątki

Określona kolumna nie jest częścią tego DataGridViewelementu .

-lub-

Właściwość DataSource została ustawiona, a IsDataBound właściwość określonej kolumny zwraca falsewartość .

dataGridViewColumn to null.

Właściwość jest ustawiona VirtualMode na true , a IsDataBound właściwość określonej kolumny zwraca falsewartość .

-lub-

Obiekt określony przez DataSource właściwość nie implementuje interfejsu IBindingList .

-lub-

Obiekt określony przez DataSource właściwość ma SupportsSorting wartość falsewłaściwości .

Przykłady

W poniższym przykładzie kodu pokazano, jak używać Sort elementu w sortowaniu programowym.

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

Uwagi

Ta metoda sortuje zawartość obiektu DataGridView , porównując wartości w określonej kolumnie. Domyślnie operacja sortowania będzie używać Compare metody do porównywania par komórek w kolumnie przy użyciu DataGridViewCell.Value właściwości .

W przypadku kolumn z właściwością ustawioną na SortModeDataGridViewColumnSortMode.AutomaticSortedColumn wartość , właściwości i SortOrder są ustawiane automatycznie i wyświetlane są odpowiednie glif sortowania. W przypadku kolumn z właściwością ustawioną na SortModeDataGridViewColumnSortMode.Programmatic, musisz wyświetlić sortowanie samodzielnie za pośrednictwem DataGridViewColumnHeaderCell.SortGlyphDirection właściwości .

Operację sortowania używaną przez tę metodę można dostosować, obsługując SortCompare zdarzenie. To zdarzenie występuje tylko wtedy, gdy DataSource właściwość nie została ustawiona.

Po ustawieniu DataSource właściwości ta metoda działa tylko dla kolumn powiązanych z danymi. Kolumny powiązane z danymi miały zestaw DataGridViewColumn.DataPropertyName właściwości. DataGridViewColumn.IsDataBound Powoduje to zwrócenie truewłaściwości .

Jeśli kontrolka DataGridView zawiera kolumny powiązane i niezwiązane, należy zaimplementować tryb wirtualny, aby zachować wartości kolumn bez ruchu przychodzącego, gdy kontrolka jest sortowana według powiązanej kolumny. Można to zrobić, ustawiając VirtualMode właściwość na true i obsługując CellValueNeeded zdarzenie. Jeśli kolumna jest edytowalna, należy również obsłużyć CellValuePushed zdarzenie. Aby uzyskać więcej informacji na temat trybu wirtualnego, zobacz Instrukcje: implementowanie trybu wirtualnego w kontrolce DataGridView Windows Forms. Sortowanie według kolumn niezwiązanych, gdy kontrolka jest powiązana z danymi, nie jest obsługiwana.

Zobacz też

Dotyczy