Когда DataGridView является привязкой к базе данных, использовать его сортировку невозможно, и необходимо сортировать исходные данные. Сортировка немного сложна, поэтому мне нужны две вспомогательные столбцы.
dgvBills.AutoGenerateColumns = False
tbl.Columns.Add(New DataColumn("Scol1", GetType(String)))
tbl.Columns.Add(New DataColumn("Scol2", GetType(Integer)))
Первый будет содержать ведущие буквы (или пустую строку). Второй будет содержать только число, содержащееся в строке. Сортируем по Scol1, Scol2
.
Теперь мы устанавливаем все comumns в Programatic
режиме (DataGridViewColumnSortMode Enumeration)
For Each column As DataGridViewColumn In dgvBills.Columns
column.SortMode = DataGridViewColumnSortMode.Programmatic
Next
И обычай сортировки достигается в обработчике ColumnHeaderMouseClick
(DataGridView.Sort Method (IComparer)). Мы будем использовать сортировку основного представления вместо сортировки Grid.
Private Sub dgvBills_ColumnHeaderMouseClick(sender As Object, e As System.Windows.Forms.DataGridViewCellMouseEventArgs) Handles dgvBills.ColumnHeaderMouseClick
Dim newColumn As DataGridViewColumn = dgvBills.Columns(e.ColumnIndex)
Dim direction As ListSortDirection
Dim Modifier As String = ""
If newColumn.HeaderCell.SortGlyphDirection = SortOrder.Ascending Then
direction = ListSortDirection.Descending
Modifier = " desc"
Else
direction = ListSortDirection.Ascending
End If
Dim View As DataView = dgvBills.DataSource
If {"JobNumber", "JobNumber1"}.Contains(dgvBills.Columns(e.ColumnIndex).Name) Then
View.Table.Columns("Scol2").Expression = String.Format("Convert(iif (substring({0},1,2) like '*-',substring({0},3,len({0})-1),{0}), 'System.Int32')", dgvBills.Columns(e.ColumnIndex).Name)
View.Table.Columns("Scol1").Expression = String.Format("iif (substring({0},1,2) like '*-',substring({0},1,2),'')", dgvBills.Columns(e.ColumnIndex).Name)
View.Sort = String.Format("Scol1 {0},Scol2 {0}", Modifier)
Else
dgvBills.Sort(newColumn, direction)
End If
If direction = ListSortDirection.Ascending Then
newColumn.HeaderCell.SortGlyphDirection = SortOrder.Ascending
Else
newColumn.HeaderCell.SortGlyphDirection = SortOrder.Descending
End If
End Sub
В {"JobNumber", "JobNumber1"}.Contains ...
можно задать столбцы, которые отсортированные differntly. Другие столбцы сортируются по типу Grid по умолчанию или можно создать другую пользовательскую сортировку.
Примечание: У меня есть полностью рабочий пример, но я надеюсь, что фрагменты достаточно хороши.
Несколько вопросов здесь ... Вы вручную добавили Scol1 и Scol2 ... Я должен создать другой столбец с именем JobNumber1 в моем DataTable? Кроме того, когда вы выполняете 'substring ({0}, 1, 2)' в выражении, что должно возвращаться? Благодаря! – Alex
В первом выражении 'Scol2', где мы используем' String.Format («Преобразование (...)» «Я получаю следующую ошибку:« Строка ввода не была в правильном формате ». – Alex
Вы упомянули, что существует 19 столбцов для сортировки. 'JobNumber1' является примером (заполнителем) других столбцов.' substring ({0}, 1, 2) 'должен возвращать первые два символа (например, T-) столбца, который является sorted - это имя 'dgvBills.Columns (e.ColumnIndex) .Name'. Я не уверен, присутствуют ли в вашем примере все строковые форматы. Можете ли вы сказать, какая строка вызывает ошибку? – IvanH