DataGridView.Sort Méthode
Définition
Important
Certaines informations portent sur la préversion du produit qui est susceptible d’être en grande partie modifiée avant sa publication. Microsoft exclut toute garantie, expresse ou implicite, concernant les informations fournies ici.
Trie le contenu du contrôle DataGridView.
Surcharges
Sort(IComparer) |
Trie le contenu du contrôle DataGridView à l’aide d’une implémentation de l’interface IComparer. |
Sort(DataGridViewColumn, ListSortDirection) |
Trie le contenu du contrôle DataGridView dans l’ordre croissant ou décroissant en fonction du contenu de la colonne spécifiée. |
Sort(IComparer)
Trie le contenu du contrôle DataGridView à l’aide d’une implémentation de l’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)
Paramètres
Exceptions
comparer
a la valeur null
.
Exemples
L’exemple de code suivant montre comment utiliser la surcharge de Sort méthode dans un scénario de tri à plusieurs colonnes. Dans cet exemple, l’interface IComparer est implémentée dans la 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
Remarques
Cette méthode permet une personnalisation avancée de la fonctionnalité de tri de la DataGridView classe. Pour implémenter une opération de tri hautement personnalisée, vous pouvez écrire un gestionnaire d’événements pour l’événement ColumnHeaderMouseClick et appeler cette méthode avec un instance d’une classe qui implémente l’interface System.Collections.IComparer en tant que paramètre. Dans ce cas, vous allez généralement définir la propriété DataGridViewColumnSortMode.Programmatic sur pour désactiver le DataGridViewColumn.SortMode tri automatique et laisser de la place pour un glyphe de tri. Lorsque vous triez par colonnes définies sur le mode de tri par programmation, vous devez afficher vous-même le glyphe de tri en définissant la DataGridViewColumnHeaderCell.SortGlyphDirection propriété .
Cette méthode fonctionne uniquement lorsque la DataSource propriété n’est pas définie. Lorsque vous liez le DataGridView contrôle à une source de données externe, vous devez utiliser les opérations de tri fournies par cette source de données. Lorsque vous fournissez votre propre source de données en implémentant le mode virtuel, vous devez également gérer les opérations de tri vous-même.
L’appel de cette méthode définit automatiquement la CurrentCell propriété sur null
.
Voir aussi
S’applique à
Sort(DataGridViewColumn, ListSortDirection)
Trie le contenu du contrôle DataGridView dans l’ordre croissant ou décroissant en fonction du contenu de la colonne spécifiée.
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)
Paramètres
- dataGridViewColumn
- DataGridViewColumn
Colonne selon laquelle trier le contenu du DataGridView.
- direction
- ListSortDirection
Une des valeurs de l'objet ListSortDirection.
Exceptions
La colonne spécifiée ne fait pas partie de ce DataGridView.
- ou -
La propriété DataSource a été définie et la propriété IsDataBound de la colonne spécifiée retourne false
.
dataGridViewColumn
a la valeur null
.
La propriété VirtualMode a été définie sur true
et la propriété IsDataBound de la colonne spécifiée retourne false
.
- ou -
L’objet spécifié par la propriété DataSource n’implémente pas l’interface IBindingList.
- ou -
L’objet spécifié par la propriété DataSource a une propriété SupportsSorting dont la valeur est false
.
Exemples
L’exemple de code suivant montre comment utiliser dans Sort un tri programmatique.
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
Remarques
Cette méthode trie le contenu du en comparant les DataGridView valeurs dans la colonne spécifiée. Par défaut, l’opération de tri utilise la Compare méthode pour comparer des paires de cellules dans la colonne à l’aide de la DataGridViewCell.Value propriété .
Pour les colonnes dont la SortMode propriété est définie DataGridViewColumnSortMode.Automaticsur , les SortedColumn propriétés et SortOrder sont définies automatiquement et le glyphe de tri approprié s’affiche. Pour les colonnes dont la SortMode propriété est définie DataGridViewColumnSortMode.Programmaticsur , vous devez afficher vous-même le glyphe de tri à l’aide de la DataGridViewColumnHeaderCell.SortGlyphDirection propriété .
Vous pouvez personnaliser l’opération de tri utilisée par cette méthode en gérant l’événement SortCompare . Cet événement se produit uniquement lorsque la DataSource propriété n’a pas été définie.
Une fois la DataSource propriété définie, cette méthode fonctionne uniquement pour les colonnes liées aux données. Les colonnes liées aux données ont leur DataGridViewColumn.DataPropertyName propriété définie. Cela entraîne le retour true
de la DataGridViewColumn.IsDataBound propriété .
Si votre DataGridView contrôle contient à la fois des colonnes liées et non liées, vous devez implémenter le mode virtuel pour conserver les valeurs des colonnes non liées lorsque le contrôle est trié par une colonne liée. Pour ce faire, définissez la VirtualMode propriété true
sur et gérez l’événement CellValueNeeded . Si la colonne est modifiable, vous devez également gérer l’événement CellValuePushed . Pour plus d’informations sur le mode virtuel, consultez Guide pratique pour implémenter le mode virtuel dans le contrôle DataGridView Windows Forms. Le tri par colonnes non liées lorsque le contrôle est lié aux données n’est pas pris en charge.