2009-11-18 14 views
18

Tengo mi solución implementada (solución básica) y estoy contento.Agregando dinámicamente ToolStripMenuItems a un MenuStrip (C#/Winforms)

Problema es cuando agrego nuevos elementos a ToolStripItemCollection usando el método 'Agregar', obtengo algunas sobrecargas ... el significativo es un parámetro de cadena, un parámetro de imagen y un parámetro EventHandler.

Debido a que mi lista desplegable va a servir como un historial dinámico en RunTime, significa que va a estar vacío en tiempo de compilación. Esto significa que no puedo agregar un controlador de eventos a través de la ruta estándar de uso de la superficie del diseñador (al hacer clic). Estoy obligado a usar la sobrecarga descrita arriba.

I imagen no sirve para nada pero agregar el controlador de eventos dinámicamente es lo que me interesa y necesito ayuda.

URL: http://msdn.microsoft.com/en-us/library/bxdt0s8t.aspx

No hay otra sobrecarga para ayudarme, así que tengo que usar una imagen ... alguien tiene alguna idea de evitar esto y me muestran cómo satisfacer plenamente esta versión sobrecargada del agregar método

TIA.

ACTUALIZACIÓN: He vuelto a hacer esto en un proyecto actual pero usando un código más simple pero el principio es el mismo, agregue manejadores de eventos dinámicamente en tiempo de ejecución. Voy a actualizar esto con un código de muestra cuando llegue a casa.

Respuesta

30

La forma en que lo hago es crear una matriz de ToolStripMenuItems y completar esa matriz con los elementos que estoy agregando. Creo un método para manejar los eventos de clic y hago que verifique algo único sobre cada elemento que creo en tiempo de ejecución. Puede intentar usar las propiedades Name o Tag de cada ToolStripMenuItem. Luego use AddRange en el lugar en el menú que está agregando. Por lo que su código podría ser algo como esto:

private void BuildMenuItems() 
{ 
    ToolStripMenuItem[] items = new ToolStripMenuItem[2]; // You would obviously calculate this value at runtime 
    for (int i = 0; i < items.Length; i++) 
    { 
     items[i] = new ToolStripMenuItem(); 
     items[i].Name = "dynamicItem" + i.ToString(); 
     items[i].Tag = "specialDataHere"; 
     items[i].Text = "Visible Menu Text Here";  
     items[i].Click += new EventHandler(MenuItemClickHandler); 
    } 

    myMenu.DropDownItems.AddRange(items); 
} 

private void MenuItemClickHandler(object sender, EventArgs e) 
{ 
    ToolStripMenuItem clickedItem = (ToolStripMenuItem)sender; 
    // Take some action based on the data in clickedItem 
} 
+0

gracias por la contestando ... esto parece promsing alhough me gustaría probar el Añadir métodos sobrecarga en primer lugar que parece ser el uno para el trabajo si alguien de aquí me puede mostrar cómo .... =) Sigo siendo optimista ... – IbrarMumtaz

+0

El método 'Agregar' funciona de la misma manera. No cree una matriz y luego haga que el bucle for funcione en un solo elemento: 'ToolStripMenuItem item = new ToolStripMenuItem();' y luego al final de la llamada for: 'myMenu.Items.Agregar (artículo); ' – jasonh

+0

Ty Tomé algunas pistas de su respuesta y la hice funcionar maravillosamente. En este momento, lo último que tengo que hacer para mi aplicación antes de pasar al siguiente gran capítulo es encontrar un método que reorganice mi menú de historial, permita que se agregue un nuevo elemento y el resto se mueva hacia arriba. Esto debería ser simple ya que lo he probado y todo parece brillante hasta ahora. – IbrarMumtaz

1

Qué hay de malo en:

ToolStripItem item = toolStripItems.Add("MyItem"); 
item.Click += new EventHandler(....); 

Me estoy perdiendo algo?

+0

No sé, soy relativamente inexperto, pero gracias a JasonH pude usar lo siguiente. No hay nada de malo en eso realmente, estaba más interesado en usar una de las sobrecargas que plantear las soluciones mencionadas anteriormente ............................ ............................................. historyToolStripMenuItem.DropDownItems.Add (treeDrives.SelectedNode.FullPath, null, new EventHandler (MenuItemClickHandler)); Esto es exactamente lo que buscaba ... y funciona maravillosamente – IbrarMumtaz

+0

Como puede ver, estoy usando la propiedad FullPath para darle al elemento un nombre significativo en lo que se refiere al archivo que se ha lanzado, nulo porque no estoy usando ninguna imagen y el controlador de eventos al final. Esta es la sobrecarga con la que estaba luchando ... parece simple ahora =). En caso de que se esté preguntando, esto agregará los archivos recientemente ejecutados al menú de historial y desde el menú los relanzará como un acceso directo ^^. – IbrarMumtaz

0

Estaba teniendo problemas similares a Philip Wallace. Es importante notar la diferencia entre un ToolStripItem y un ToolStripMenuItem. Estaba agregando ToolStripItems a DropDownItems de ToolStripMenuItem, y se mostraban, y tenían todas las propiedades configuradas correctamente, y accesibles en código, ¡pero no mostraban ningún texto! El cambio a ToolStripMenuItem resolvió esto.

En cuanto a la pregunta original, he estado usando el constructor vacío y estableciendo los campos que necesitaba. (Estoy en vb.net con .NET 4.0, y no me deja llamar New ToolStripMenuItem() ya que tiene una etiqueta MustInherit, así que hice esta clase:

Public Class DynamicToolStripMenuItem 
    Inherits ToolStripMenuItem 

    Public Sub New(value As Integer, text As String, handler As System.EventHandler) 
     MyBase.New() 
     Me.Text = text 
     Me.Visible = True 
     Me.Tag = value 
     AddHandler Me.Click, handler 
    End Sub 
End Class 
0

puede simplemente pasar null para la imagen .

Menu.DropDownItems.Add(Text, null, EventHandler); 
Cuestiones relacionadas