DataGridView.Sort Método
Definição
Importante
Algumas informações se referem a produtos de pré-lançamento que podem ser substancialmente modificados antes do lançamento. A Microsoft não oferece garantias, expressas ou implícitas, das informações aqui fornecidas.
Classifica o conteúdo do controle DataGridView.
Sobrecargas
Sort(IComparer) |
Classifica o conteúdo do controle DataGridView usando uma implementação da interface IComparer. |
Sort(DataGridViewColumn, ListSortDirection) |
Classifica o conteúdo do controle DataGridView em ordem crescente ou decrescente com base no conteúdo da coluna especificada. |
Sort(IComparer)
Classifica o conteúdo do controle DataGridView usando uma implementação da interface 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)
Parâmetros
- comparer
- IComparer
Uma implementação de IComparer que executa a operação de classificação personalizada.
Exceções
comparer
é null
.
Exemplos
O exemplo de código a seguir demonstra como usar a sobrecarga de Sort método em um cenário de classificação de várias colunas. Neste exemplo, a IComparer interface é implementada na RowComparer
classe .
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
Comentários
Esse método permite a personalização avançada do recurso de classificação da DataGridView classe . Para implementar uma operação de classificação altamente personalizada, você pode escrever um manipulador de eventos para o ColumnHeaderMouseClick evento e chamar esse método com uma instância de uma classe que implementa a System.Collections.IComparer interface como um parâmetro. Nesse caso, você normalmente definirá a DataGridViewColumn.SortMode propriedade como DataGridViewColumnSortMode.Programmatic para desabilitar a classificação automática e deixar espaço para um glifo de classificação. Ao classificar por colunas definidas como modo de classificação programática, você deve exibir o glifo de classificação por conta própria definindo a DataGridViewColumnHeaderCell.SortGlyphDirection propriedade .
Esse método funciona somente quando a DataSource propriedade não está definida. Ao associar o DataGridView controle a uma fonte de dados externa, você deve usar as operações de classificação fornecidas por essa fonte de dados. Ao fornecer sua própria fonte de dados implementando o modo virtual, você também deve lidar com as operações de classificação por conta própria.
Chamar esse método define automaticamente a CurrentCell propriedade como null
.
Confira também
Aplica-se a
Sort(DataGridViewColumn, ListSortDirection)
Classifica o conteúdo do controle DataGridView em ordem crescente ou decrescente com base no conteúdo da coluna especificada.
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)
Parâmetros
- dataGridViewColumn
- DataGridViewColumn
A coluna pela qual o conteúdo do DataGridView será classificado.
- direction
- ListSortDirection
Um dos valores de ListSortDirection.
Exceções
A coluna especificada não faz parte deste DataGridView.
- ou -
A propriedade DataSource foi definida e a propriedade IsDataBound da coluna especificada retorna false
.
dataGridViewColumn
é null
.
A propriedade VirtualMode é definida como true
e a propriedade IsDataBound da coluna especificada retorna false
.
- ou -
O objeto especificado pela propriedade DataSource não implementa a interface IBindingList.
- ou -
O objeto especificado pela propriedade DataSource tem um valor false
da propriedade SupportsSorting.
Exemplos
O exemplo de código a seguir demonstra como usar o Sort em uma classificação programática.
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
Comentários
Esse método classifica o conteúdo do DataGridView comparando valores na coluna especificada. Por padrão, a operação de classificação usará o Compare método para comparar pares de células na coluna usando a DataGridViewCell.Value propriedade .
Para colunas com a SortMode propriedade definida como DataGridViewColumnSortMode.Automatic, as SortedColumn propriedades e SortOrder são definidas automaticamente e o glifo de classificação apropriado é exibido. Para colunas com a SortMode propriedade definida DataGridViewColumnSortMode.Programmaticcomo , você deve exibir o glifo de classificação por conta própria por meio da DataGridViewColumnHeaderCell.SortGlyphDirection propriedade .
Você pode personalizar a operação de classificação usada por esse método manipulando o SortCompare evento. Esse evento ocorre somente quando a DataSource propriedade não foi definida.
Quando a DataSource propriedade foi definida, esse método funciona apenas para colunas associadas a dados. As colunas associadas a dados tiveram suas DataGridViewColumn.DataPropertyName propriedades definidas. Isso faz com que a DataGridViewColumn.IsDataBound propriedade retorne true
.
Se o DataGridView controle contiver colunas associadas e não associadas, você deverá implementar o modo virtual para manter os valores das colunas não associadas quando o controle for classificado por uma coluna associada. Você pode fazer isso definindo a VirtualMode propriedade como true
e tratando o CellValueNeeded evento. Se a coluna for editável, você também deverá manipular o CellValuePushed evento. Para obter mais informações sobre o modo virtual, consulte How to: Implement Virtual Mode in the Windows Forms DataGridView Control. Não há suporte para a classificação por colunas não associadas quando o controle está associado a dados.