2009-09-09 3 views
8

Каков правильный способ сообщить DataGridView о прекращении сортировки?.NET/WinForms - Очистить сортировку по DataGridView

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

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

+0

Является ли это сетью, привязанной к данным? –

+0

Да. Но я даже переключаю DataSources. Я вызываю DataSource = null и Columns.Clear перед коммутатором. – BuddyJoe

+0

Я хотел бы иметь возможность разрешить обновление, но сохранить порядок сортировки. Но если пользователь переключает то, на что они хотят смотреть (через TreeView), я бы хотел, чтобы порядок сортировки уходил. Это ошибка? Я пробовал несколько вещей, я не могу понять, как это уйти. – BuddyJoe

ответ

1

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

+0

хорошая идея. У меня есть поддельный столбец, который я добавляю в DataTable после того, как DataAdapter загружает его под именем «row_number», для которого он используется, - это разбиение на страницы (если я захочу включить это). +1. Это может быть мой ответ. – BuddyJoe

+1

Существуют ограничения на сортировку на «поддельных» столбцах в сочетании с источником данных, см. MSDN. –

6

От MSN Forums:

DataGridView связан с DataView, а не таблицы непосредственно, поэтому вам необходимо установить:

DataTable.DefaultView.Sort = String.Empty

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

6

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

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

+0

Это не работает, если DataSource является DataTable –

+0

Спасибо! Я просто использовал BindingSource.Sort = "", и он работал отлично. – CrazyPaste

-1
/// C# 
/// Author : Jeudi Prando 

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

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

1

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

  if (dgv.SortedColumn != null) { 
       DataGridViewColumn col = dgv.SortedColumn; 
       col.SortMode = DataGridViewColumnSortMode.NotSortable; 
       col.SortMode = DataGridViewColumnSortMode.Automatic; 
      } 
0

У меня была и эта проблема сегодня. У меня есть DataGridView, который регулярно меняет свои DataSource (a 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. Например.:

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

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