BindingList
не поддерживает сортировку. Также на MSDN это имеет значение для BindingSource
:
Если источник данных не является IBindingList, свойство SupportsSorting всегда возвращает false.
Вы можете NET доставить вам файлы в порядке LastWriteTime
, так что вам не придется сортировать их (а также избавиться от петли):
Dim theFiles = New DirectoryInfo(fpath).EnumerateFiles(fmask, SearchOption.TopDirectoryOnly).
Where(Function(f) f.Length > szMin).
OrderByDescending(Function(s) s.LastWriteTime)
dgv2.DataSource = New BindingSource(theFiles, Nothing)
NET поместит файлы в порядке и исключить файлы, которые не совпадают, а не доставлять их вам только для проверки и исключения. Результатом является IEnumerable
, который источник привязки может использовать напрямую.
Если вы хотите, чтобы добавить их в список и отсортировать их, используйте List(Of FileInfo)
для хранения и сортировки, а затем BindingSource
для добавления/удаления.
Private filesBS As BindingSource
Private FilesList As List(Of FileInfo)
...
FilesList = New DirectoryInfo(...).EnumerateFiles("*.csv", SearchOption.AllDirectories).
Where(Function(f) f.Length > MinSize).
OrderByDescending(Function(q) q.LastWriteTime).
ToList()
filesBS = New BindingSource(FilesList, Nothing)
dgv2.DataSource = filesBS
Запрос файлов такая же, как и раньше, я просто добавил ToList()
; затем используйте его для BindingSource
. Если вы добавите и удалите элементы через BindingSource
, они будут показаны в коллекции и DGV.
filesBS.RemoveAt(0)
filesBS.Add(newItem)
тоскливая часть сортировка, потому что это должно быть сделано «вручную» (который должен сказать DGV обыкновения/косяка сделать это), и потому, что есть так много свойств к FileInfo
. Один из способов сортировки является использование методов расширения, как это было сделано в запросе:
' sort by file size
If fileSortOrder = SortOrder.Ascending Then
FilesList = FilesList.OrderBy(Function(f) f.Length).ToList()
Else
FilesList = FilesList.OrderByDescending(Function(f) f.Length).ToList()
End If
filesBS = New BindingSource(FilesList, Nothing)
' ToDo: toggle fileSortOrder like below
dgv2.DataSource = filesBS
Обратите внимание, что поскольку FilesList
коллекция заново, вам необходимо восстановить BindingSource
, а также.Вы также можете использовать Sort
метод:
FilesList.Sort(AddressOf FileInfoSizeCompare)
dgv2.Refresh()
...
Private fileSortOrder As SortOrder = SortOrder.Ascending
Private Function FileInfoSizeCompare(x As FileInfo, y As FileInfo) As Int32
Dim sortReverser As Int32 = If(fileSortOrder = SortOrder.Ascending, 1, -1)
Dim ret As Int32 = 0
If x.Length < y.Length Then ret = -1
If x.Length > y.Length Then ret = 1
Return (ret * sortReverser)
End Function
В этом случае, так как список не воссоздан, вам просто нужно обновить контроль перерисовать содержимое. Вам понадобится другой метод для каждого столбца/свойства, которое вы хотите сортировать. При любом подходе, если вы вызываете методы из события ColumnHeaderMouseClick
, он будет работать так, как если бы DGV мог сортировать DataSource
.
Если бы я использовал вторую версию, я мог бы поместить методы сортировки в класс, чтобы а) я мог повторно использовать их и б) получить весь этот код из форм.
Если базовые данные находятся в 'BindingList', они не поддерживают сортировку. BindingSource - это просто оболочка, поэтому он не может добавлять возможности. – Plutonix
[Этот проект] (http://blw.sourceforge.net/) может быть полезен или, возможно, ответы на [этот вопрос] (http: // stackoverflow .com/вопросы/1699642/как к сортировки с привязкой к данным DataGridView-колонки). – Mark