2011-02-24 37 views
5

tôi thêm dây (bài) tự động đến một ToolStripItemCollection bởi:Cách sắp xếp các mục trong ToolStripItemCollection?

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

Vì vậy, các mặt hàng không được thêm vào trong một đi, nhưng một-by-one dựa trên gây ra bên ngoài trong suốt phiên chương trình. Tôi muốn sắp xếp danh sách thả xuống mỗi khi tôi thêm một mục mới. Các lựa chọn của tôi để đạt được điều đó là gì?

Trả lời

6

Kể từ ToolStripItemCollection không có "Sắp xếp" -Function, bạn phải lắng nghe những thay đổi và viết riêng loại-phương pháp của bạn:

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 

Bạn phải sử dụng Comparer của riêng bạn (http://msdn.microsoft.com/en-us/library/0e743hdt.aspx)

+0

Nó trông đẹp, nhưng tôi có được ngoại lệ: failed to compare two elements in the array - at least one object must implement icomparable. Điều này có tham khảo các lớp đối tượng chính nó; ToolStripMenuItem? Tôi sẽ xem liệu tôi có hiểu được trình so sánh tùy chỉnh không. – bretddog

+0

Xin lỗi, bạn PHẢI sử dụng một trình so sánh riêng, vì không có bộ công cụ nào cho ToolStripMenuItem, do đó mảng không biết cách sắp xếp. Tôi đã cập nhật mã ở trên. – SpeziFish

+0

Tuyệt! Tôi đã phải vật lộn với điều đó .. Chúc mừng! – bretddog

3

này bài đăng đã được gắn thẻ là C# vì vậy tôi đã chuyển đổi nó dựa trên câu trả lời của SpeziFish. Cảm ơn!

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

Nếu chúng ta cần phải sắp xếp các mục trong ToolStripItemCollection, chúng ta có thể sử dụng như sau:

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

Tôi cho rằng bạn đang gặp phải 'ItemCollection = ...'? điều này sẽ không hoạt động mặc dù thuộc tính 'DropDownItems' là chỉ đọc. –

Các vấn đề liên quan