web-dev-qa-db-fra.com

Ajout dynamique de ToolStripMenuItems à un MenuStrip (C #/Winforms)

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.

18
IbrarMumtaz

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
}
31
jasonh

Qu'est-ce qui ne va pas chez:

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

Est-ce que je manque quelque chose?

1
Philip Wallace

Vous pouvez simplement passer null pour l'image.

Menu.DropDownItems.Add(Text, null, EventHandler);
0
John

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
0
QuickDanger