.NET / WinForms - очистить сортировку в DataGridView - PullRequest
9 голосов
/ 10 сентября 2009

Как правильно указать DataGridView прекратить сортировку?

У меня есть «экран», на котором я говорю программно сортировать сетку по столбцу 4 и по возрастанию. Когда я переключаюсь в другую область, я хочу, чтобы та же самая сетка пришла в 'default' / no sort. Я удаляю все столбцы и добавляю новые. Сортировка остается в 4-м столбце.

Я не вижу способа сделать это с помощью метода Sort (). Есть идеи?

Ответы [ 7 ]

7 голосов
/ 24 сентября 2009

Я получил доступ к сортировке на BindingSource напрямую:

((BindingSource)_dgv.DataSource).Sort = string.Empty;

6 голосов
/ 10 сентября 2009

Из Форумы MSN :

DataGridView привязан к DataView, а не к таблице напрямую, поэтому вам нужно установить:

DataTable.DefaultView.Sort = String.Empty

Эффективно очистить сортировку на столе и тем самым привязать к нему сетку. По-видимому, для этого требуется обновить DataGridView, если только вы не используете 2005, а затем вы можете использовать отдельный менеджер связывания.

1 голос
/ 27 января 2014

в том же домене, что и ответ от пользователя 2268720 .. не самое чистое решение, но сделал работу для меня с несвязанным DGV:

            if (dgv.SortedColumn != null) {
                DataGridViewColumn col = dgv.SortedColumn;
                col.SortMode = DataGridViewColumnSortMode.NotSortable;
                col.SortMode = DataGridViewColumnSortMode.Automatic;
            }
1 голос
/ 10 сентября 2009

Не прямой ответ, но, конечно, нет хорошего определения «несортированный». Вы не можете сортировать по (скрытому) столбцу, например по идентификатору?

0 голосов
/ 10 мая 2016

У меня сегодня тоже была эта проблема. У меня есть DataGridView, который регулярно меняет DataSource (DataTable). Мне удалось окончательно удалить сортировку, указанную пользователем, когда пользователь щелкнул заголовок столбца, используя следующий код:

    If dgv.SortedColumn IsNot Nothing AndAlso dgv.DataSource IsNot Nothing Then
        Dim dt_Sender As DataTable = DirectCast(dgv.DataSource, DataTable)
        dt_Sender.DefaultView.Sort = dt_Sender.Columns(0).ColumnName & " ASC"
    End If

Это работает, потому что в моем DataGridView есть скрытый столбец, который всегда находится в позиции с индексом столбца 0. Это целочисленный первичный ключ для базовых данных, который сортируется при загрузке данных.

* Возможно, вам придется указать свой столбец индекса в DataTable, если вы еще этого не сделали (например, dt_Sender.Columns(0).ColumnName = "colIndex").

* Если вы используете объект BindingSource в качестве посредника между вашим DataGridView и вашим DataTable (как, кажется, делают многие люди), то вам придется соответствующим образом вложить ваш DirectCast во вторую строку. (т. е. Dim dt_Sender As DataTable = DirectCast(dgv.DataSource, DataTable) изменится на что-то вроде: Dim dt_Sender As DataTable = DirectCast(DirectCast(dgv.DataSource, BindingSource), DataTable)).

* Кроме того, если ваш DataTable заполнен запросом SQL Server, который не имеет целочисленного первичного ключа (возможно, GUID?), То вы можете изменить его исходный запрос, включив в него новый номер строки и затем спрячьте новый столбец в вашем DataGridView. E.g.:

SELECT Row_Number() OVER (ORDER BY (SELECT '')) AS RowNumber, Column1, Column2, Column3
FROM SourceTable

Надеюсь, это решение пригодится кому-то еще в будущем.

0 голосов
/ 15 августа 2013

Попробуйте установить для источника элементов сетки значение Nothing, затем снова установите для него значение DefaultView таблицы

0 голосов
/ 11 апреля 2013
/// C#
/// Author : Jeudi Prando

foreach (DataGridViewColumn column in this.DataGridView1.Columns)
{
    column.SortMode = DataGridViewColumnSortMode.NotSortable;
    column.SortMode = DataGridViewColumnSortMode.Automatic;
}
...