.net VB BindingSource支持设置为false。为什么?

.net VB BindingSource支持设置为false。为什么?,.net,vb.net,list,sorting,bindingsource,.net,Vb.net,List,Sorting,Bindingsource,我一直在互联网上四处游荡,试图弄明白这一点,但我做不到 我有一个BindingSource,我从.GetFiles添加了一堆FileInfos 当我逐步执行时,BindingSource的SupportsSorting属性是False。我不明白为什么 我尝试将BindingSource.DataSource设置为bindingslist,而不是逐个添加每个FileInfo,但是基本列表仍然是IList类型 这是我的密码: If Directory.Exists(configPath) Then

我一直在互联网上四处游荡,试图弄明白这一点,但我做不到

我有一个
BindingSource
,我从
.GetFiles
添加了一堆
FileInfo
s

当我逐步执行时,
BindingSource
SupportsSorting
属性是
False
。我不明白为什么

我尝试将
BindingSource.DataSource
设置为
bindingslist
,而不是逐个添加每个
FileInfo
,但是基本列表仍然是
IList
类型

这是我的密码:

 If Directory.Exists(configPath) Then
            For Each foundFile As FileInfo In New DirectoryInfo(configPath).GetFiles("*.csv", SearchOption.TopDirectoryOnly)
                If foundFile.Length >= My.Settings.scanFileSizeThreshold Then

                    scansBindingSource.Add(foundFile)
                End If
            Next
        Else
我想做的就是这样:

scansBindingList.Sort = "LastWriteTime Desc"

并按上次写入时间对DataGridView中的数据进行排序。这可能吗?谢谢

绑定列表不支持排序。MSDN上也有用于
BindingSource

如果数据源不是IBindingList,SupportsOrting属性始终返回false

您可以让NET按
LastWriteTime
的顺序将文件传递给您,这样您就不必对它们进行排序(同时也可以消除循环):

NET会将文件按顺序排列,并排除不匹配的文件,而不是将它们交付给您进行测试和排除。结果是绑定源可以直接使用的
IEnumerable

如果您希望能够添加到这些文件的列表中并对它们进行排序,请使用
列表(文件信息)
进行存储和排序,然后使用
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
。您还可以使用
排序
方法:

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
filelist.Sort(FileInfoSizeCompare的地址)
dgv2.Refresh()
...
Private fileSortOrder As SortOrder=SortOrder.singressing
私有函数FileInfoSizeCompare(x作为FileInfo,y作为FileInfo)作为Int32
按Int32=If(fileSortOrder=SortOrder.Ascending,1,-1)对排序器进行调整
Dim ret As Int32=0
如果x.长度小于y.长度,则ret=-1
如果x.长度>y.长度,则ret=1
返回(ret*sortReverser)
端函数
在这种情况下,由于不重新创建列表,因此只需刷新控件即可重新绘制内容。您需要为每个要排序的列/属性使用不同的方法。无论采用哪种方法,如果从
ColumnHeaderMouseClick
事件调用方法,它都将像DGV可以对
数据源进行排序时一样工作


如果我使用第二个版本,我可能会将排序方法放在一个类中,以便a)我可以重用它们,b)从表单中获取所有代码。

绑定列表不支持排序。MSDN上也有用于
BindingSource

如果数据源不是IBindingList,SupportsOrting属性始终返回false

您可以让NET按
LastWriteTime
的顺序将文件传递给您,这样您就不必对它们进行排序(同时也可以消除循环):

NET会将文件按顺序排列,并排除不匹配的文件,而不是将它们交付给您进行测试和排除。结果是绑定源可以直接使用的
IEnumerable

如果您希望能够添加到这些文件的列表中并对它们进行排序,请使用
列表(文件信息)
进行存储和排序,然后使用
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
。您还可以使用
排序
方法:

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
filelist.Sort(FileInfoSizeCompare的地址)
dgv2.Refresh()
...
Private fileSortOrder As SortOrder=SortOrder.singressing
私有函数FileInfoSizeCompare(x作为FileInfo,y作为FileInfo)作为Int32
按Int32=If(fileSortOrder=SortOrder.Ascending,1,-1)对排序器进行调整
Dim ret As Int32=0
如果x.长度小于y.长度,则ret=-1
如果x.长度>y.长度,则ret=1
返回(ret*sortReverser)
端函数
在这种情况下,由于不重新创建列表,因此只需刷新控件即可重新绘制内容。您需要为每个要排序的列/属性使用不同的方法。无论采用哪种方法,如果从
ColumnHeaderMouseClick
事件调用方法,它都将像DGV可以对
数据源进行排序时一样工作


如果使用第二个版本,我可能会将排序方法放入一个类中,以便a)我可以重用它们,b)从表单中获取所有代码。

如果基础数据位于
绑定列表中,则它们不支持排序。BindingSource只是一个包装器,因此它无法添加功能,这可能会有所帮助,也可能是它的答案。如果基础数据位于
BindingList
中,则它们不支持排序。酒是酸的