对ListBox项进行排序

时间:2012-04-19 15:09:14

标签: vb.net winforms visual-studio-2010 listbox

所以我有两个ListBoxes。 Listbox1从目录收集文件,我有一个添加按钮,用于将Listbox1中的选定文件添加到Listbox2。

有没有办法手动对这些项目进行排序?也许有一个向上按钮?

我想要排序/重新排序的原因是我将有一个运行这些选定文件的进程,每个文件都必须生成另一个文件名唯一的文件。

一个简单的例子是处理FILE1.txt并生成FILE1.pdf等。

是否有更简单的方法来完成排序/重新排序?

更新

目前,我正在填充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

2 个答案:

答案 0 :(得分:2)

您可以使用数据绑定,而不是将项目逐个添加到ListBox。我建议您先将文件添加到列表中,然后对列表进行排序并将其分配给ListBox的{​​{1}}。

将列表定义为类成员

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

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

更新#2

我不知道您的文件是如何完全命名的,但是如果它们总是以Static comparer = New MyFileComparer() _list.Sort(comparer) 结尾,您还可以更改字符串比较的文件名,如下所示:

原始文件名

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

现在"FILE<number>.<ext>"方法可以使用

确定结果
Compare

答案 1 :(得分:2)

对Olivier的答案进行抄袭,或许Sorted List对您有用吗?

如果您需要的不仅仅是字母名称排序,还可以使用OrderBy对项目进行排序。

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

(语法可能已关闭)