1

所以我有两个列表框。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
4

2 回答 2

2

您可以使用数据绑定而不是将项目一一添加到ListBox. 我建议您先将文件添加到列表中,然后对列表进行排序并将其分配给ListBox.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

然后你可以像这样排序

Static comparer =  New MyFileComparer()

_list.Sort(comparer)

更新#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)
于 2012-04-19T15:21:31.563 回答
2

捎带奥利维尔的回答,也许排序列表可能对你有用?

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

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

(语法可能已关闭)

于 2012-04-19T15:25:15.360 回答