Vb.net 对列表框项目进行排序

Vb.net 对列表框项目进行排序,vb.net,winforms,visual-studio-2010,listbox,Vb.net,Winforms,Visual Studio 2010,Listbox,所以我有两个列表框。Listbox1从一个目录中收集文件,我有一个add按钮将Listbox1中选定的文件添加到Listbox2 有没有办法对这些项目进行手动排序?也许有上下按钮 我之所以要排序/重新排序,是因为我将有一个进程来运行这些选定的文件,并且每个文件都必须生成另一个文件名唯一的文件 一个简单的例子是processfile1.txt和productfile1.pdf,等等 是否有更简单的方法来完成排序/重新排序 更新 下面是我当前如何填充我的列表框1,然后再将任何内容添加到列表框2,这是

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

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

我之所以要排序/重新排序,是因为我将有一个进程来运行这些选定的文件,并且每个文件都必须生成另一个文件名唯一的文件

一个简单的例子是processfile1.txt和productfile1.pdf,等等

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

更新

下面是我当前如何填充我的
列表框1
,然后再将任何内容添加到
列表框2
,这是我希望以某种方式排序的列表框

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

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

定义类成员的列表

Private _list As New List(Of String)()
将其分配到
列表框

 listBox1.DataSource = _list
然后使用

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

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

更新

如果要实现自己的排序顺序,请实现一个
i比较程序(字符串)

然后你可以这样分类

Static comparer =  New MyFileComparer()

_list.Sort(comparer)

更新#2

我不知道文件的确切名称,但是如果它们总是以
“FILE”结尾。
您也可以更改字符串比较的文件名,如下所示:

原始文件名

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

定义类成员的列表

Private _list As New List(Of String)()
将其分配到
列表框

 listBox1.DataSource = _list
然后使用

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

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

更新

如果要实现自己的排序顺序,请实现一个
i比较程序(字符串)

然后你可以这样分类

Static comparer =  New MyFileComparer()

_list.Sort(comparer)

更新#2

我不知道文件的确切名称,但是如果它们总是以
“FILE”结尾。
您也可以更改字符串比较的文件名,如下所示:

原始文件名

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
根据奥利弗的回答,也许a对你有用

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

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

(语法可能不正确)

背上奥利弗的答案,也许a对你有用

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

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

(语法可能已关闭)

如果每次文件名都不相同怎么办?也就是说,今天的文件可能被命名为xyz_FILE1.txt或xyx_123_FILE1.txt。我正在寻找某种方法来始终将某个文件作为列表框中的第一项,依此类推。
Sort
例程有一个重载,它接受一个
IComparaer
。这允许你实现自己的排序顺序。我一定会仔细考虑你的建议。说到VB(自学),我还是个新手,所以我可能还有其他问题。你提醒我你是用VB编程的。我将代码从C#更改为VB。是否有更好的方式向您展示我当前更新的代码?我看到过一个使用比较器的例子,根据我填充列表框的方式,我不能100%确定如何使用比较器。如果每次文件名都不相同怎么办?也就是说,今天的文件可能被命名为xyz_FILE1.txt或xyx_123_FILE1.txt。我正在寻找某种方法来始终将某个文件作为列表框中的第一项,依此类推。
Sort
例程有一个重载,它接受一个
IComparaer
。这允许你实现自己的排序顺序。我一定会仔细考虑你的建议。说到VB(自学),我还是个新手,所以我可能还有其他问题。你提醒我你是用VB编程的。我将代码从C#更改为VB。是否有更好的方式向您展示我当前更新的代码?我看到了一个使用比较器的示例,但根据我填充列表框的方式,无法100%确定如何使用它。您应该从For Each循环中删除
ListBox1.DataSource=\u list
。循环结束后刷新列表框就足够了,并且第一次不需要
ListBox1.DataSource=Nothing
。只有在以后才需要,以便强制
数据源
刷新;否则,当您再次分配同一列表时,即使您同时向列表中添加了项目,它也不会执行任何操作。请在
下一步
之后调用
\u list.Sort()
。在每次添加单个项目后对列表进行排序没有意义。您应该从For each循环中删除
ListBox1.DataSource=\u list
。循环结束后刷新列表框就足够了,并且第一次不需要
ListBox1.DataSource=Nothing
。只有在以后才需要,以便强制
数据源
刷新;否则,当您再次分配同一列表时,即使您同时向列表中添加了项目,它也不会执行任何操作。请在
下一步
之后调用
\u list.Sort()
。在每次添加单个项目后,没有必要对列表进行排序。