自然排序CheckedListbox

时间:2012-04-18 15:16:34

标签: .net vb.net winforms checkedlistbox

我编写了以下类来创建使用自然排序算法的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,但它只是使用默认算法对项目进行排序,而不是自然排序算法(已经过测试并显示在其他地方按预期工作)。

1 个答案:

答案 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直到你全部添加它们。这是导致怪癖的代价。