Как отсортировать элементы в ToolStripItemCollection? - PullRequest
6 голосов
/ 24 февраля 2011

Я динамически добавляю строки (элементы) в коллекцию ToolStripItemCollection:

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

Таким образом, элементы добавляются не за один раз, а по одному на основе внешних триггеров в течение сеанса программы. Я хотел бы отсортировать выпадающий список каждый раз, когда добавляю новый элемент. Какие у меня есть варианты для этого?

Ответы [ 3 ]

7 голосов
/ 24 февраля 2011

Поскольку ToolStripItemCollection не имеет функции "Sort", вы должны прослушать изменения и написать свой собственный метод сортировки:

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

Вы должны использовать свой собственный компаратор (http://msdn.microsoft.com/en-us/library/0e743hdt.aspx)

3 голосов
/ 24 апреля 2015

Это сообщение было помечено как c #, поэтому я преобразовал его на основе ответа SpeziFish Спасибо!

private void ResortToolStripItemCollection(ToolStripItemCollection coll)
    {
        System.Collections.ArrayList oAList = new System.Collections.ArrayList(coll);
        oAList.Sort(new ToolStripItemComparer());
        coll.Clear();

        foreach (ToolStripItem oItem in oAList)
        {
            coll.Add(oItem);
        }
    }

public class ToolStripItemComparer : System.Collections.IComparer
{
    public int Compare(object x, object y)
    {
        ToolStripItem oItem1 = (ToolStripItem)x;
        ToolStripItem oItem2 = (ToolStripItem)y;
        return string.Compare(oItem1.Text, oItem2.Text, true);
    }
}
0 голосов
/ 01 июля 2015

Если нам нужно отсортировать элементы в ToolStripItemCollection, мы можем использовать следующее:

ItemCollection.OfType<ToolStripItem>().OrderBy(x => x.Text).ToArray(); 
...