【问题标题】:Sorting ListBox Items排序列表框项
【发布时间】:2012-05-01 03:31:04
【问题描述】:

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

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

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

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

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

更新

这是我目前如何填充我的listbox1,然后添加任何内容到listbox2,这是我希望以这种或其他方式排序的列表框。

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

【问题讨论】:

  • 您应该从 For-Each 循环中删除 ListBox1.DataSource = _list。在循环终止后刷新 ListBox 就足够了,ListBox1.DataSource = Nothing 第一次不是必需的。只是以后需要,为了强制DataSource 刷新;否则,当您再次分配相同的列表时,即使您同时向列表中添加了项目,它也不会执行任何操作。
  • Next 之后致电_list.Sort()。在每个添加单个项目之后对列表进行排序是没有意义的。

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


【解决方案1】:

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

定义一个类成员列表

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)

【讨论】:

  • 如果文件名每次都不一样怎么办?这意味着,今天一个文件可能被命名为 xyz_FILE1.txt 或 xyx_123_FILE1.txt。我正在寻找某种方法来始终将某个文件作为列表框中的第一项,依此类推。
  • Sort 例程有一个接受IComparaer<T> 的重载。这允许您实现自己的排序顺序。
  • 我一定会考虑您的建议。在 VB(自学)方面我还是个新手,所以我可能还有其他问题。
  • 你提醒我你正在用 VB 编程。我将代码从 C# 更改为 VB。
  • 有没有更好的方法向您展示我目前拥有的更新代码?我已经看到一个使用比较器的示例,但不是 100% 确定如何根据我填充列表框的方式使用它。
【解决方案2】:

捎带 Olivier 的回答,也许 Sorted List 可能对你有用?

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

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

(语法可能关闭)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-09
    • 2014-02-14
    • 2011-04-14
    • 2011-09-30
    • 1970-01-01
    • 1970-01-01
    • 2015-07-11
    • 1970-01-01
    相关资源
    最近更新 更多