2

Natural Sort アルゴリズムを使用する 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 は Listbox から派生しているため、Sort()オーバーライドが機能すると考えましたが、なぜ機能しないのかがわかりません。

インスタンスの を設定しています.Sorted = Trueが、それはデフォルトのアルゴリズムを使用してアイテムを並べ替えているだけであり、Natural Sort アルゴリズム (他の場所でテストされ、期待どおりに動作することが示されています) ではありません。

4

1 に答える 1

4

はい、これは「癖」です。バグと呼ぶ人もいますが、ネイティブの Windows コントロールに対して .NET ラッパーをボルトで固定することによる典型的な損失です。問題は、ネイティブの Windows リストボックス コントロールが既に並べ替えを実装していることです。Sorted を True に設定すると、ラッパーは、追加された項目の並べ替えを開始するようにコントロールに指示します。Sort() メソッドが追加され、並べ替え順序をカスタマイズできるようになりました。これは明らかに便利です。

問題は、このメソッドは、Sorted を true に設定した場合にのみ実行されることです。新しいアイテムを追加するたびに Sort() を呼び出すわけではありません。項目を追加したときに Sorted が既に true であった場合、並べ替えるのはネイティブ コントロールです。注文をカスタマイズしたときの明らかな失敗。

あなたがしなければならないことは、Sort() メソッドを強制的に再実行することです。それには、次のようなばかげたコードが必要です。

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

これはコストがかかることに注意してください。複数のアイテムを追加する場合は、すべてのアイテムを追加するまでソート済みを切り替えて待ちます。クセの原因となった出費です。

于 2012-04-18T20:55:09.677 に答える