У меня сегодня тоже была эта проблема. У меня есть 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
Надеюсь, это решение пригодится кому-то еще в будущем.