DataGridView.Sort Metoda

Definice

Seřadí obsah DataGridView ovládacího prvku.

Přetížení

Sort(IComparer)

Seřadí obsah DataGridView ovládacího prvku pomocí implementace IComparer rozhraní.

Sort(DataGridViewColumn, ListSortDirection)

Seřadí obsah DataGridView ovládacího prvku vzestupně nebo sestupně podle obsahu zadaného sloupce.

Sort(IComparer)

Seřadí obsah DataGridView ovládacího prvku pomocí implementace IComparer rozhraní.

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

Implementace IComparer , která provádí vlastní operace řazení.

Výjimky

comparer je null.

VirtualMode je nastavená na truehodnotu .

-nebo-

DataSource není null.

Příklady

Následující příklad kódu ukazuje, jak použít Sort přetížení metody ve scénáři řazení s více sloupci. V tomto příkladu je rozhraní implementováno IComparerRowComparer ve třídě .

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

Poznámky

Tato metoda umožňuje pokročilé přizpůsobení funkce DataGridView řazení třídy. Chcete-li implementovat vysoce přizpůsobenou operaci řazení, můžete napsat obslužnou rutinu události pro ColumnHeaderMouseClick událost a volat tuto metodu s instancí třídy, která implementuje System.Collections.IComparer rozhraní jako parametr. V takovém případě obvykle nastavíte DataGridViewColumn.SortMode vlastnost na hodnotu , DataGridViewColumnSortMode.Programmatic abyste zakázali automatické řazení a nechali prostor pro řazení piktogramů. Při řazení podle sloupců nastavených na programový režim řazení musíte zobrazit piktogram řazení sami nastavením DataGridViewColumnHeaderCell.SortGlyphDirection vlastnosti .

Tato metoda funguje pouze v případě, že DataSource vlastnost není nastavena. Když svážete DataGridView ovládací prvek s externím zdrojem dat, musíte použít operace řazení poskytované tímto zdrojem dat. Když poskytnete vlastní zdroj dat implementací virtuálního režimu, musíte také zpracovávat operace řazení sami.

Volání této metody automaticky nastaví CurrentCell vlastnost na null.

Viz také

Platí pro

Sort(DataGridViewColumn, ListSortDirection)

Seřadí obsah DataGridView ovládacího prvku vzestupně nebo sestupně podle obsahu zadaného sloupce.

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

Sloupec, podle kterého se má seřadit obsah objektu DataGridView.

direction
ListSortDirection

Jedna z ListSortDirection hodnot.

Výjimky

Zadaný sloupec není součástí tohoto DataGridViewsloupce .

-nebo-

Vlastnost DataSource byla nastavena a IsDataBound vlastnost zadaného sloupce vrátí false.

dataGridViewColumn je null.

Vlastnost VirtualMode je nastavená na true hodnotu a IsDataBound vlastnost zadaného sloupce vrátí falsehodnotu .

-nebo-

Objekt určený DataSource vlastností neimplementuje IBindingList rozhraní .

-nebo-

Objekt určený DataSource vlastností má SupportsSorting hodnotu falsevlastnosti .

Příklady

Následující příklad kódu ukazuje, jak použít v Sort programovém řazení.

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

Poznámky

Tato metoda seřadí obsah objektu DataGridView porovnáním hodnot v zadaném sloupci. Ve výchozím nastavení bude operace řazení používat metodu Compare k porovnání dvojic buněk ve sloupci pomocí DataGridViewCell.Value vlastnosti .

U sloupců s vlastností nastavenou SortMode na DataGridViewColumnSortMode.Automaticjsou SortedColumn vlastnosti a SortOrder nastaveny automaticky a zobrazí se příslušný piktogram řazení. U sloupců s SortMode vlastností nastavenou na DataGridViewColumnSortMode.Programmaticmusíte glyf řazení zobrazit sami prostřednictvím DataGridViewColumnHeaderCell.SortGlyphDirection vlastnosti .

Operaci řazení používanou touto metodou můžete přizpůsobit zpracováním SortCompare události. K této události dochází pouze v DataSource případě, že vlastnost nebyla nastavena.

DataSource Pokud je vlastnost nastavena, funguje tato metoda pouze pro sloupce vázané na data. Sloupce vázané na data mají nastavenou DataGridViewColumn.DataPropertyName vlastnost. To způsobí, že DataGridViewColumn.IsDataBound vlastnost vrátí true.

Pokud ovládací DataGridView prvek obsahuje vázané i nevázané sloupce, musíte implementovat virtuální režim pro zachování hodnot nevázaných sloupců, když je ovládací prvek seřazený podle vázaného sloupce. Můžete to provést nastavením vlastnosti na VirtualModetrue a zpracováním CellValueNeeded události. Pokud je sloupec upravitelný, měli byste také zpracovat CellValuePushed událost. Další informace o virtuálním režimu naleznete v tématu Postupy: Implementace virtuálního režimu v ovládacím prvku model Windows Forms DataGridView. Řazení podle sloupců bez vazby, pokud je ovládací prvek vázán na data, není podporováno.

Viz také

Platí pro