Search code examples
c#.netvb.netcontextmenutoolstripdropdown

How to sort items in ToolStripItemCollection?


I add strings (items) dynamically to a ToolStripItemCollection by:

Dim onClickHandler As System.EventHandler = New System.EventHandler(AddressOf Symbol_Click)
Dim item As New ToolStripMenuItem(newSymbol, Nothing, onClickHandler)
SomeToolStripMenuItem.DropDownItems.Add(item)

So the items are not added in one go, but one-by-one based on external triggers throughout the program session. I would like to sort the drop-down-list every time I add a new item. What are my options to achieve that?


Solution

  • Since ToolStripItemCollection has no "Sort"-Function, you have to listen on changes and write your own sort-method:

    Private Sub ResortToolStripItemCollection(coll As ToolStripItemCollection)
        Dim oAList As New System.Collections.ArrayList(coll)
        oAList.Sort(new ToolStripItemComparer())
        coll.Clear()
    
        For Each oItem As ToolStripItem In oAList
            coll.Add(oItem)
        Next
    End Sub
    
    Private Class ToolStripItemComparer Implements System.Collections.IComparer
        Public Function Compare(x As Object, y As Object) As Integer Implements System.Collections.IComparer.Compare
            Dim oItem1 As ToolStripItem = DirectCast(x, ToolStripItem)
            Dim oItem2 As ToolStripItem = DirectCast(y, ToolStripItem)
            Return String.Compare(oItem1.Text,oItem2.Text,True)
        End Function
    End Class
    

    You have to use your own comparer (https://learn.microsoft.com/en-us/dotnet/api/system.collections.arraylist.sort)