2011-02-24 8 views
5

que agregar cadenas (material) de forma dinámica a un ToolStripItemCollection por:¿Cómo ordenar elementos en ToolStripItemCollection?

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

Así que los artículos no se agregan de una sola vez, pero uno por uno basado en disparadores externos a lo largo de la sesión del programa. Me gustaría ordenar la lista desplegable cada vez que agregue un nuevo elemento. ¿Cuáles son mis opciones para lograr eso?

Respuesta

6

Desde ToolStripItemCollection no tiene "Ordenar" -Función, usted tiene que escuchar en los cambios y escribir su propia especie método:

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 

Usted tiene que usar su propio comparador (http://msdn.microsoft.com/en-us/library/0e743hdt.aspx)

+0

Se veía bien, pero me da la excepción: failed to compare two elements in the array - at least one object must implement icomparable. ¿Se refiere esto a la misma clase de objeto; ToolStripMenuItem? Veré si entiendo el comparador personalizado ... – bretddog

+0

Oh, lo siento, DEBES usar un comparador propio, porque no hay ninguno para ToolStripMenuItem, por lo que la matriz no sabe cómo ordenar. Actualicé el código de arriba. – SpeziFish

+0

¡Genial! Hubiera luchado con eso ... ¡Salud! – bretddog

3

Este la publicación se etiquetó como C#, por lo que la convertí en función de la respuesta de SpeziFish. ¡Gracias!

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

Si tenemos que ordenar los elementos en ToolStripItemCollection, podemos utilizar el siguiente:

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

Supongo que usted mencionó 'ItemCollection = ...'? esto no funcionará, ya que la propiedad 'DropDownItems' es de solo lectura. –

Cuestiones relacionadas