2012-04-18 82 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