2017-02-22 32 views
0

Я пытаюсь сортировать datagridview, но с 9000 до 10 000, что-то не работает. 10000 человек помещено перед 9000. Вот мой код и скриншот моей программыСортировка элементов datagridview 9,000 до 10,000

enter image description here

DataGridView1.Sort(DataGridView1.Columns(0), System.ComponentModel.ListSortDirection.Ascending) 
+4

Вот как струны сортируются. «9» имеет более высокое значение, чем «1000»; он сортирует по значению ASCII символов. Пожалуйста, прочитайте [Ask] и возьмите [Tour]. – Plutonix

+0

Так как я могу это исправить? –

+0

Пожалуйста, прочитайте [Ask] и возьмите [Tour]. Вам нужно приложить некоторые усилия, чтобы исправить проблемы с pwn и задать реальный вопрос. Если числовая часть не доступна сама по себе, вам необходимо ее изолировать или использовать Natural Sort. – Plutonix

ответ

0

Попробуйте использовать пункт OrderBy Linq в. Он позволяет разделить строку и отсортировать по номерам.

Dim dList As List(Of Datagridviewrow) = datagridview1.Rows.Cast(of DataGridViewRow).ToList() 
dList = dList.OrderBy(Function(q) Integer.Parse(q.Cells(0).Value.ToString().Split("-").Last)).ToList() 
DataGridView1.DataSource = dList.Select(function(x) x.DataBoundItem).ToList() 
+0

Ответ обновляется после тестирования. Это работает до тех пор, пока все ячейки в строке 0 содержат формат «- #», который @Simon Stifler имеет в своем примере. – Ethilium

+0

Я попробовал. Я понимаю. Единственная проблема заключается в том, что я улавлю эту ошибку: ссылка на объект не установлена ​​в экземпляр объекта. Я думаю, что это происходит, когда ячейка либо пуста, либо ничего не происходит после «-». Моя последняя строка всегда пуста (не знаю почему). Есть ли способ сделать список без последней строки? –

+0

@SimonStifler вместо второй строки используйте dList = dList.Where (function (p) p.Cells (0) .Value IsNot ничего) .OrderBy (Function (q) Integer.Parse (q.Cells (0) .Value .ToString(). Split ("-"). Last)). ToList() – Ethilium

0

Есть few ways for custom sorting in the DataGridView Control

Обычно самый простой и вообще обрабатывать DataGridView.SortCompare событие:

Private Sub DataGridView1_SortCompare(sender As Object, e As DataGridViewSortCompareEventArgs) Handles DataGridView1.SortCompare 
    If e.Column.Index <> 0 Then Return       ' custom sort only for the first column 
    e.SortResult = Len(e.CellValue1).CompareTo(Len(e.CellValue2)) ' compare by string length 
    e.Handled = e.SortResult <> 0         ' to use the default comparison if same length 
End Sub 

Другой вариант передать IComparer методу DataGridView.Sort (.Create потребности .NET 4.5):

DataGridView1.Sort(Comparer(Of DataGridViewRow).Create(
        Function(r1, r2) 
         Dim o1 = r1.Cells(0).Value, o2 = r2.Cells(0).Value 
         Dim i = Len(o1).CompareTo(Len(o2)) 
         If i = 0 Then i = o1.ToString.CompareTo(o2) 
         Return i 
        End Function)) 
Смежные вопросы