DataGridView.Sort Metoda
Definice
Důležité
Některé informace platí pro předběžně vydaný produkt, který se může zásadně změnit, než ho výrobce nebo autor vydá. Microsoft neposkytuje žádné záruky, výslovné ani předpokládané, týkající se zde uváděných informací.
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
Výjimky
comparer
je 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í false
hodnotu .
-nebo-
Objekt určený DataSource vlastností neimplementuje IBindingList rozhraní .
-nebo-
Objekt určený DataSource vlastností má SupportsSorting hodnotu false
vlastnosti .
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
Váš názor
https://aka.ms/ContentUserFeedback.
Připravujeme: V průběhu roku 2024 budeme postupně vyřazovat problémy z GitHub coby mechanismus zpětné vazby pro obsah a nahrazovat ho novým systémem zpětné vazby. Další informace naleznete v tématu:Odeslat a zobrazit názory pro