2012-04-19 6 views
1

Итак, у меня есть два ListBoxes. Listbox1 собирает файлы из каталога, и у меня есть кнопка добавления для добавления выбранных файлов из Listbox1 в Listbox2.Сортировка элементов ListBox

Есть ли способ вручную отсортировать эти товары? Может быть, с кнопками вверх?

Причина, по которой я хотел бы отсортировать/изменить порядок, будет иметь процесс, который будет запускать эти выбранные файлы, и каждый файл должен будет создать другой файл, уникальный для имени файла.

Быстрый пример будет процесс FILE1.TXT и производить FILE1.pdf и т.д.

Есть ли более простой способ сделать сортировку/изменить порядок?

UPDATE

Вот в настоящее время, как я заселение мой listbox1, прежде чем добавить что-нибудь к listbox2, который является ListBox Я хотел бы быть отсортированы так, так или иначе.

Dim directoryInfo As _ 
    New System.IO.DirectoryInfo(FolderBrowserDialog1.SelectedPath) 
Dim fileInfos() As System.IO.FileInfo 

fileInfos = directoryInfo.GetFiles() 
For Each fileInfo As System.IO.FileInfo In fileInfos 
    ListBox1.DataSource = _list 
    _list.Add(fileInfo.Name) 
    _list.Sort() 
Next 

'Refresh Listbox1 
ListBox1.DataSource = Nothing 
ListBox1.DataSource = _list 
+0

Вы должны удалить 'ListBox1.DataSource = _list' из-For-Каждый цикл. Достаточно обновить ListBox после того, как цикл завершился, и 'ListBox1.DataSource = Nothing' не требуется в первый раз. Это необходимо только позже, чтобы заставить «DataSource» обновиться; в противном случае, когда вы снова назначаете тот же список, он ничего не сделает, даже если вы добавили элементы в список тем временем. –

+0

Вызов '_list.Sort()' после 'Next'. Нет смысла сортировать список после каждого добавления одного элемента. –

ответ

1

Вы можете использовать привязку данных вместо добавления детали по одному на ListBox. Я предлагаю вам сначала добавить файлы в список, а затем отсортировать список и назначить его ListBox's DataSource.

определить список члена класса

Private _list As New List(Of String)() 

Назначают его в ListBox

listBox1.DataSource = _list 

Затем добавить новую запись списка с

_list.Add("new file") 
_list.Sort() 

' Refresh the ListBox 
listBox1.DataSource = Nothing 
listBox1.DataSource = _list 

UPDATE

Если вы хотите реализовать свой собственный порядок сортировки, то реализовать IComparer(Of String)

Class MyFileComparer 
    Implements IComparer(Of String) 

    Public Function Compare(x As String, y As String) As Integer _ 
     Implements IComparer(Of String).Compare 

     Const AlwaysFirst As String = "FILE1" 

     Dim x = If(x.Contains(AlwaysFirst), "1_", "2_") & x 
     Dim y = If(y.Contains(AlwaysFirst), "1_", "2_") & y 

     ' Note: If "FILE1" appears always at the end then this would be better 
     'Dim x = If(x.EndsWith(AlwaysFirst & ".txt"), "1_", "2_") & x 
     'Dim y = If(y.EndsWith(AlwaysFirst & ".txt"), "1_", "2_") & y 

     ' Normalize strings (e.g. if "File_123.txt" = ""File 123.txt") 
     x = x.Replace("_"C, " "C) 
     y = y.Replace("_"C, " "C) 

     Return x.CompareTo(y) 
    End Function 
End Class 

Тогда вы можете сортировать как этот

Static comparer = New MyFileComparer() 

_list.Sort(comparer) 

UPDATE # 2

я не знаю как ваши файлы называются точно, однако, если они всегда заканчиваются "FILE<number>.<ext>" вы также можете изменить имя файла для сравнения строк, как это:

Оригинальных имен файлов

 
abc_FILE1.txt 
abc_123_FILE2.txt 
sssd_FILE23.txt 
xxx_24_FILE073.txt 

Подготовленных имен файлов

 
FILE001_abc.txt 
FILE002_abc_123.txt 
FILE023_sssd.txt 
FILE073_xxx_24.txt 

Теперь метод Compare может определить результат просто с

Return x_prepared.CompareTo(y_prepared) 
+0

Что делать, если имена файлов были разными? Смысл, сегодня файл можно назвать xyz_FILE1.txt или xyx_123_FILE1.txt. Я ищу какой-то способ всегда получить определенный файл в качестве первого элемента в списке и так далее. – Muhnamana

+1

Процедура 'Sort' имеет перегрузку, которая принимает' IComparaer '. Это позволяет вам реализовать свой собственный порядок сортировки. –

+0

Я обязательно рассмотрю ваше предложение. Я все еще довольно новичок, когда речь идет о VB (преподавание), поэтому у меня могут быть другие вопросы. – Muhnamana

2

Ответ на ответ Оливье, возможно, для вас может работать Sorted List?

Вы также можете использовать OrderBy для сортировки элементов, если вам нужно больше, чем сортировка альфа-имени.

var sorted = from m in myCollection select m orderBy m.FileName; 

(синтаксис может быть выключен)

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