2011-02-24 36 views
5

我通過以下方式動態地將字符串(項)添加到ToolStripItemCollection:如何在ToolStripItemCollection中對項目進行排序?

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

因此,項目不會一次性添加,而是在整個程序會話中逐個添加外部觸發器。我想在每次添加新項目時對下拉列表進行排序。我有什麼選擇來實現這一目標?

回答

6

由於ToolStripItemCollection沒有「排序」 - 功能,你要聽上的變化,寫自己的排序方法:

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

+0

它看起來不錯,但我得到異常:failed to compare two elements in the array - at least one object must implement icomparable.這是否指的是對象類本身; ToolStripMenuItem?我會看看我是否瞭解自定義比較器.. – bretddog

+0

哦,對不起,您必須使用自己的比較器,因爲沒有ToolStripMenuItem,所以數組不知道如何排序。我更新了上面的代碼。 – SpeziFish

+0

酷!我會一直與那個鬥爭..乾杯! – bretddog

3

這帖子被標記爲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

如果我們需要在ToolStripItemCollection項目進行排序,我們可以使用以下命令:

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

我假設你需要'ItemCollection = ...'?這將不起作用,因爲'DropDownItems'屬性是隻讀的。 –

相關問題