2016-08-17 2 views
1

Я путешествовал по сеткам, пытаясь понять это, но я не могу.VB BindingSource SupportsSorting является ложным. Зачем?

У меня есть BindingSource, к которому я .add связка FileInfo s от .GetFiles.

Когда я перешагиваю, BindingSourceSupportsSorting является False. Я не понимаю, почему.

Я попытался установить BindingSource.DataSource к BindingList вместо добавления каждого 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 отсортированы по дате последнего времени записи. Это возможно? Благодаря!

+1

Если базовые данные находятся в 'BindingList', они не поддерживают сортировку. BindingSource - это просто оболочка, поэтому он не может добавлять возможности. – Plutonix

+1

[Этот проект] (http://blw.sourceforge.net/) может быть полезен или, возможно, ответы на [этот вопрос] (http: // stackoverflow .com/вопросы/1699642/как к сортировки с привязкой к данным DataGridView-колонки). – Mark

ответ

0

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.

Если бы я использовал вторую версию, я мог бы поместить методы сортировки в класс, чтобы а) я мог повторно использовать их и б) получить весь этот код из форм.

 Смежные вопросы

  • Нет связанных вопросов^_^