【问题标题】:Natural Sorting a CheckedListbox自然排序 CheckedListbox
【发布时间】:2012-04-18 15:16:33
【问题描述】:

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

【问题讨论】:

  • 你的NaturalSortedCheckedListbox的构造函数被调用了吗?
  • 好问题,是的。

标签: .net vb.net winforms checkedlistbox


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 刚发现这个,供以后参考。我所做的是在我的扩展列表框中编写我自己的小方法DoSort。它所做的只是为我调用列表框的Sort 方法。然后设置标志更容易。