J'ai ma solution mise en œuvre (solution de base) et je suis heureux.
Le problème est que lorsque j'ajoute de nouveaux éléments à ToolStripItemCollection à l'aide de la méthode 'Add', j'obtiens quelques surcharges ... la plus significative étant un paramètre de chaîne, un paramètre d'image et un paramètre EventHandler.
Parce que ma liste déroulante va servir d'historique dynamique à RunTime, cela signifie qu'elle sera vide lors de la compilation. Cela signifie que je ne peux pas ajouter de gestionnaire d'événement via l'itinéraire standard consistant à utiliser la surface du concepteur (Sur clic). Je suis obligé d'utiliser la surcharge décrite ci-dessus.
L'image ne m'est d'aucune utilité, mais l'ajout du gestionnaire d'événements de manière dynamique est ce qui m'intéresse et dans lequel j'ai besoin d'aide.
URL: http://msdn.Microsoft.com/en-us/library/bxdt0s8t.aspx
Il n'y a pas d'autre surcharge pour m'aider, alors je dois utiliser une Image ... tout le monde a des idées pour contourner cela et me montrer comment satisfaire pleinement cette version surchargée de la méthode add.
TIA.
UPDATE: C’est ce que j’ai fait de nouveau dans un projet en cours, mais en utilisant un code plus lisse, mais le principe est le même, ajoutez des gestionnaires d’événements de manière dynamique au moment de l’exécution. Je mettrai à jour ceci avec un exemple de code quand je rentrerai à la maison.
Pour ce faire, je crée un tableau de ToolStripMenuItems
et le remplit avec les éléments que j'ajoute. Je crée une méthode pour gérer les événements de clic et lui demander de vérifier quelque chose d'unique concernant chaque élément que je crée au moment de l'exécution. Vous pouvez essayer d’utiliser les propriétés Name
ou Tag
de chaque ToolStripMenuItem
. Ensuite, utilisez AddRange
sur place dans le menu que vous ajoutez. Donc, votre code pourrait ressembler à quelque chose comme ça:
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
}
Qu'est-ce qui ne va pas chez:
ToolStripItem item = toolStripItems.Add("MyItem");
item.Click += new EventHandler(....);
Est-ce que je manque quelque chose?
Vous pouvez simplement passer null pour l'image.
Menu.DropDownItems.Add(Text, null, EventHandler);
J'avais des problèmes similaires à ceux de Philip Wallace. Il est important de noter la différence entre un ToolStripItem et un ToolStripMenuItem. J'ajoutais ToolStripItems à DropDownItems de ToolStripMenuItem, et ils apparaissaient, et toutes les propriétés étaient correctement définies et accessibles dans le code, mais elles ne pouvaient afficher aucun texte! Basculer vers un ToolStripMenuItem a résolu ce problème.
En ce qui concerne la question initiale, j'ai utilisé le constructeur vide et défini les champs dont j'avais besoin. (Je suis dans vb.net avec .net 4.0, et il ne me permet pas d'appeler New ToolStripMenuItem()
puisqu'il contient une balise MustInherit
. J'ai donc créé cette classe:
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