2

我编写了以下类来创建使用自然排序算法的 CheckedListbox。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 派生自 Listbox,所以我认为Sort()覆盖会起作用,但我不知道为什么它不起作用。

我正在设置实例的.Sorted = True,但它只是使用默认算法对项目进行排序,而不是自然排序算法(已经过测试并显示在其他地方按预期工作)。

4

1 回答 1

4

是的,这是一个“怪癖”,有人称其为错误,但在原生 Windows 控件上使用螺栓连接 .NET 包装器是非常典型的损失。问题是本机 Windows 列表框控件已经实现了排序。当您将 Sorted 设置为 True 时,包装器会告诉控件开始对添加的任何项目进行排序。Sort() 方法被固定以允许自定义排序顺序,这显然很有用。

麻烦的是,该方法仅在您将 Sorted 设置为 true 时运行。每次添加新项目时,它都不会调用 Sort()。如果在添加项目时 Sorted 已经为真,那么它是排序的本机控件。自定义订单时明显失败的鲸鱼。

您需要做的是强制 Sort() 方法再次运行。这需要像这样的愚蠢代码:

    MyCheckedListBox1.Items.Add("sortdammit")
    MyCheckedListBox1.Sorted = False
    MyCheckedListBox1.Sorted = True

请注意,这很昂贵,因此如果您添加多个项目,请等待切换已排序,直到您将它们全部添加。引起怪癖的是费用。

于 2012-04-18T20:55:09.677 回答