DataGridView.Sort Метод
Определение
Важно!
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Сортирует содержимое элемента управления DataGridView.
Перегрузки
Sort(IComparer) |
Сортирует содержимое элемента управления DataGridView, используя реализацию интерфейса IComparer. |
Sort(DataGridViewColumn, ListSortDirection) |
Сортирует содержимое элемента управления DataGridView по убыванию или по возрастанию, основываясь на содержимом указанного столбца. |
Sort(IComparer)
Сортирует содержимое элемента управления DataGridView, используя реализацию интерфейса 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)
Параметры
Исключения
comparer
имеет значение null
.
Примеры
В следующем примере кода показано, как использовать перегрузку метода в сценарии сортировки Sort по нескольким столбцам. В этом примере IComparer интерфейс реализуется в RowComparer
классе .
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
Комментарии
Этот метод позволяет выполнять расширенную настройку функции сортировки DataGridView класса . Чтобы реализовать операцию сортировки с высокой степенью настройки, можно написать обработчик событий для ColumnHeaderMouseClick события и вызвать этот метод с экземпляром класса, реализующего интерфейс в System.Collections.IComparer качестве параметра. В этом случае для свойства DataGridViewColumnSortMode.Programmatic обычно устанавливается значение DataGridViewColumn.SortMode , чтобы отключить автоматическую сортировку и оставить место для глифа сортировки. При сортировке по столбцам в режиме программной сортировки необходимо отобразить глиф сортировки DataGridViewColumnHeaderCell.SortGlyphDirection самостоятельно, задав свойство .
Этот метод работает только в том случае, DataSource если свойство не задано. При привязке DataGridView элемента управления к внешнему источнику данных необходимо использовать операции сортировки, предоставляемые этим источником данных. При предоставлении собственного источника данных путем реализации виртуального режима необходимо также самостоятельно обрабатывать операции сортировки.
При вызове этого метода для свойства автоматически устанавливается CurrentCell значение null
.
См. также раздел
Применяется к
Sort(DataGridViewColumn, ListSortDirection)
Сортирует содержимое элемента управления DataGridView по убыванию или по возрастанию, основываясь на содержимом указанного столбца.
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)
Параметры
- dataGridViewColumn
- DataGridViewColumn
Столбец, по которому выполняется сортировка содержимого DataGridView.
- direction
- ListSortDirection
Одно из значений перечисления ListSortDirection.
Исключения
Указанный столбец не является частью этого DataGridView.
-или-
Свойство DataSource задано, и свойство IsDataBound указанного столбца возвращает false
.
dataGridViewColumn
имеет значение null
.
Для свойства VirtualMode задано значение true
, и свойство IsDataBound указанного столбца возвращает false
.
-или-
Объект, указанный свойством DataSource, не реализует интерфейс IBindingList.
-или-
Объект, указанный свойством DataSource, имеет значение свойства SupportsSorting, равное false
.
Примеры
В следующем примере кода показано, как использовать в программной сортировке Sort .
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
Комментарии
Этот метод сортирует содержимое объекта , DataGridView сравнивая значения в указанном столбце. По умолчанию операция сортировки Compare будет использовать метод для сравнения пар ячеек в столбце DataGridViewCell.Value с помощью свойства .
Для столбцов со свойством SortModeDataGridViewColumnSortMode.Automatic, SortedColumn свойства и SortOrder задаются автоматически, и отображается соответствующий глиф сортировки. Для столбцов со свойством SortMode , для свойства DataGridViewColumnSortMode.Programmaticнеобходимо отобразить глиф сортировки самостоятельно через DataGridViewColumnHeaderCell.SortGlyphDirection свойство .
Операцию сортировки, используемую этим методом, можно настроить путем обработки SortCompare события . Это событие возникает только в том случае, DataSource если свойство не задано.
DataSource Если свойство задано, этот метод работает только для столбцов, привязанных к данным. Для столбцов, привязанных к данным, задано свойство DataGridViewColumn.DataPropertyName . Это приводит к тому, что DataGridViewColumn.IsDataBound свойство возвращает .true
Если элемент DataGridView управления содержит как привязанные, так и несвязанные столбцы, необходимо реализовать виртуальный режим для сохранения значений несвязанных столбцов при сортировке элемента управления по привязанным столбцам. Это можно сделать, присвоив свойству VirtualMode значение true
и об обрабатывая CellValueNeeded событие. Если столбец доступен для редактирования, следует также обработать CellValuePushed событие . Дополнительные сведения о виртуальном режиме см. в разделе Практическое руководство. Реализация виртуального режима в Windows Forms элемента управления DataGridView. Сортировка по несвязанным столбцам, если элемент управления привязан к данным, не поддерживается.