我编写了以下类来创建使用自然排序算法的CheckedListboxes。但是,重写的Sort()
方法不会被触发。
(该方法中的代码来自MSDN示例,介绍如何在常规列表框上实现自己的排序算法。)
Public Class NaturalSortedCheckedListbox
Inherits CheckedListBox
Private _naturalComparer As New NaturalSortComparer
Public Sub New()
MyBase.new()
End Sub
Protected Overrides Sub Sort()
'** A breakpoint on the following line will not get hit.
If Items.Count > 1 Then
Dim swapped As Boolean
Do
Dim counter As Integer = Items.Count - 1
swapped = False
While counter > 0
If _naturalComparer.Compare(Items(counter).ToString(), Items(counter - 1).ToString()) = -1 Then
Dim temp As Object = Items(counter)
Items(counter) = Items(counter - 1)
Items(counter - 1) = temp
swapped = True
End If
counter -= 1
End While
Loop While swapped
End If
End Sub
End Class
CheckedListbox派生自一个列表框,所以我认为Sort()
覆盖会起作用,但我不知道它为什么没有。
我正在设置实例的.Sorted = True
,但它只是使用默认算法对项目进行排序,而不是自然排序算法(已经过测试并显示在其他地方按预期工作)。
答案 0 :(得分:4)
是的,这是一个“怪癖”,有些人称之为一个错误,但通过在本机Windows控件上使用螺栓式.NET包装器来实现典型的损失。问题是本机Windows列表框控件已经实现了排序。当您将Sorted设置为True时,包装器会告诉控件开始排序所有添加的项目。使用Sort()方法进行螺栓连接以允许自定义排序顺序,这显然很有用。
麻烦的是,该方法仅在您将Sorted设置为true时运行。每次添加新项目时都不会调用Sort()。如果在添加项目时Sorted已经为true,那么它就是对其进行排序的本机控件。当你定制订单时明显失败的鲸鱼。
您需要做的是强制Sort()方法再次运行。这需要像这样的愚蠢代码:
MyCheckedListBox1.Items.Add("sortdammit")
MyCheckedListBox1.Sorted = False
MyCheckedListBox1.Sorted = True
请注意这是很昂贵的,所以如果你添加多个项目,那么等待切换Sorted直到你全部添加它们。这是导致怪癖的代价。