DataGridView.Sort Metodo
Definizione
Importante
Alcune informazioni sono relative alla release non definitiva del prodotto, che potrebbe subire modifiche significative prima della release definitiva. Microsoft non riconosce alcuna garanzia, espressa o implicita, in merito alle informazioni qui fornite.
Ordina il contenuto del controllo DataGridView.
Overload
Sort(IComparer) |
Ordina il contenuto del controllo DataGridView usando un'implementazione dell'interfaccia IComparer. |
Sort(DataGridViewColumn, ListSortDirection) |
Ordina il contenuto del controllo DataGridView in modo crescente o decrescente in base al contenuto della colonna specificata. |
Sort(IComparer)
Ordina il contenuto del controllo DataGridView usando un'implementazione dell'interfaccia 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)
Parametri
- comparer
- IComparer
Implementazione di IComparer che esegue l'operazione di ordinamento personalizzata.
Eccezioni
comparer
è null
.
Esempio
Nell'esempio di codice seguente viene illustrato come usare l'overload del Sort metodo in uno scenario di ordinamento a più colonne. In questo esempio l'interfaccia IComparerRowComparer
viene implementata nella 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
Commenti
Questo metodo consente la personalizzazione avanzata della funzionalità di ordinamento della DataGridView classe. Per implementare un'operazione di ordinamento altamente personalizzata, è possibile scrivere un gestore eventi per l'evento e chiamare questo metodo con un'istanza di una classe che implementa l'interfaccia ColumnHeaderMouseClickSystem.Collections.IComparer come parametro. In questo caso, in genere si imposta la proprietà su DataGridViewColumnSortMode.Programmatic per disabilitare l'ordinamento DataGridViewColumn.SortMode automatico e per lasciare spazio per un glifo di ordinamento. Quando si ordinano per colonne impostate su modalità di ordinamento a livello di codice, è necessario visualizzare il glifo di ordinamento autonomamente impostando la DataGridViewColumnHeaderCell.SortGlyphDirection proprietà.
Questo metodo funziona solo quando la DataSource proprietà non è impostata. Quando si associa il controllo a un'origine dati esterna, è necessario usare le operazioni di ordinamento fornite dall'origine DataGridView dati. Quando si specifica un'origine dati personalizzata implementando la modalità virtuale, è necessario gestire anche le operazioni di ordinamento.
La chiamata a questo metodo imposta automaticamente la CurrentCell proprietà su null
.
Vedi anche
Si applica a
Sort(DataGridViewColumn, ListSortDirection)
Ordina il contenuto del controllo DataGridView in modo crescente o decrescente in base al contenuto della colonna specificata.
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)
Parametri
- dataGridViewColumn
- DataGridViewColumn
Colonna in base alla quale deve essere ordinato il contenuto di DataGridView.
- direction
- ListSortDirection
Uno dei valori di ListSortDirection.
Eccezioni
La colonna specificata non fa parte dell'oggetto DataGridView.
-oppure-
The DataSource property has been set and the IsDataBound property of the specified column returns false
.
dataGridViewColumn
è null
.
La proprietà VirtualMode è stata impostata su true
e la proprietà IsDataBound della colonna specificata restituisce false
.
-oppure-
L'oggetto specificato dalla proprietà DataSource non implementa l'interfaccia IBindingList.
-oppure-
L'oggetto specificato dalla proprietà DataSource include un valore false
per la proprietà SupportsSorting.
Esempio
Nell'esempio di codice seguente viene illustrato come usare l'oggetto Sort in un ordinamento programmatico.
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
Commenti
Questo metodo ordina il contenuto dell'oggetto DataGridView confrontando i valori nella colonna specificata. Per impostazione predefinita, l'operazione di ordinamento userà il Compare metodo per confrontare coppie di celle nella colonna usando la DataGridViewCell.Value proprietà .
Per le colonne con la SortMode proprietà impostata su DataGridViewColumnSortMode.Automatic, le SortedColumn proprietà e SortOrder vengono impostate automaticamente e viene visualizzato il glifo di ordinamento appropriato. Per le colonne con la SortMode proprietà impostata su DataGridViewColumnSortMode.Programmatic, è necessario visualizzare il glifo di ordinamento tramite la DataGridViewColumnHeaderCell.SortGlyphDirection proprietà .
È possibile personalizzare l'operazione di ordinamento utilizzata da questo metodo gestendo l'evento SortCompare . Questo evento si verifica solo quando la DataSource proprietà non è stata impostata.
Quando la DataSource proprietà è stata impostata, questo metodo funziona solo per le colonne associate ai dati. Le colonne associate ai dati hanno avuto il relativo DataGridViewColumn.DataPropertyName set di proprietà. In questo modo la DataGridViewColumn.IsDataBound proprietà restituisce true
.
Se il DataGridView controllo contiene colonne associate e non in uscita, è necessario implementare la modalità virtuale per mantenere i valori delle colonne non in uscita quando il controllo viene ordinato da una colonna associata. È possibile eseguire questa operazione impostando la proprietà su true
e gestendo l'evento.VirtualModeCellValueNeeded Se la colonna è modificabile, è necessario gestire anche l'evento CellValuePushed . Per altre informazioni sulla modalità virtuale, vedere Procedura: Implementare la modalità virtuale nel controllo DataGridView Windows Forms. L'ordinamento in base alle colonne non in uscita quando il controllo è associato ai dati non è supportato.