2012-04-18 77 views
2

我写了下面的类来创建使用自然排序算法的CheckedListboxes。但是,重写的Sort()方法并未被解雇。自然排序CheckedListbox

(该方法中的代码是如何实现在常规列表框自己的排序算法的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

您的'NaturalSortedCheckedListbox'的构造函数是否被调用? – 2012-04-18 15:22:50

+0

伟大的问题,是的,它是。 – MCattle 2012-04-18 15:24:54

回答

4

是的,这是一个“怪癖”,有人称它为一个错误,但非常典型的损失与本地Windows控件上的螺纹.NET包装。问题是本地Windows列表框控件已经实现了排序。当您将Sorted设置为True时,包装会通知控件开始排序添加的所有项目。 Sort()方法被锁定以允许自定义排序顺序,这显然很有用。

问题是,该方法只在设置Sorted为true时运行。每次添加新项目时它都不会调用Sort()。如果Sorted在添加项目时已经为true,那么它就是排序的本地控件。定制订单时显然失败。

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

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

当心,这是昂贵的,所以如果您添加多个项目然后切换排序,直到你将他们加入所有的等待。这是导致怪癖的费用。

+0

这样做,谢谢! – MCattle 2012-04-18 21:56:39

+0

我不能相信这个!没有更好的办法! – 2012-11-28 16:21:16

+0

刚刚来到这里,供将来参考。我做的是在我的扩展列表框中编写我自己的小方法'DoSort'。它所做的只是为我调用列表框的“Sort”方法。设置标志更容易。 – AnotherUser 2014-06-16 17:53:48