Ajout dynamique d'outils à un Menuitep (C#/ Winforms)

j'ai ma solution implémentée (solution de base) et je suis heureux.

le problème est que lorsque j'ajoute de nouveaux éléments à une collecte ToolStripItem en utilisant la méthode 'Add', j'obtiens quelques surcharges ... le plus significatif étant un paramètre string, un paramètre image et un paramètre EventHandler.

parce que ma liste déroulante va servir d'historique dynamique à L'exécution, elle va être vide au moment de la compilation. Cela signifie que je ne peux pas ajouter un gestionnaire d'événements à travers le itinéraire standard de l'utilisation de la surface concepteur (sur le clic). Je suis forcé d'utiliser la surcharge décrite ci-dessus.

j'ai l'image est d'aucune utilité pour moi, mais en y ajoutant le gestionnaire d'événement de façon dynamique est ce que je suis intéressé et qui ont besoin d'aide avec.

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

Il n'y a pas d'autres surcharge pour m'aider, donc je dois utiliser une Image ... quelqu'un a une idée pour contourner ça et me montrer comment satisfaire pleinement ça. version surchargée de la méthode add.

TIA.

mise à jour: j'ai refait cela dans un projet en cours mais en utilisant plus de slicker code mais le principe est le même, ajouter des gestionnaires d'événements dynamiquement au moment de l'exécution. Je le mettrai à jour avec un exemple de code quand je rentrerai à la maison.

18
demandé sur IbrarMumtaz 2009-11-18 20:12:46

4 réponses

la façon dont je le fais est de créer un tableau de ToolStripMenuItems et peupler ce tableau avec les éléments que j'ajoute. Je crée une méthode pour gérer les événements de clic et lui faire vérifier quelque chose d'unique au sujet de chaque élément que je crée à l'exécution. Vous pouvez essayer en utilisant le Name ou Tag propriétés de chaque ToolStripMenuItem. Ensuite, utilisez AddRange sur place dans le menu que vous ajoutez. Ainsi, votre code pourrait ressembler à quelque chose comme ceci:

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
}
30
répondu jasonh 2009-11-19 20:32:24

Quel est le problème avec:

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

Est-ce que je rate quelque chose?

1
répondu Philip Wallace 2009-11-19 20:41:05

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'étais en train d'ajouter ToolStripItems à DropDownItems D'un ToolStripMenuItem, et ils apparaîtraient, et toutes les propriétés seraient correctement définies, et accessibles en code, mais ils ne montreraient aucun texte! Passer à un ToolStripMenuItem résolu cela.

en ce qui concerne la question originale, j'ai utilisé le constructeur vide, et j'ai placé les champs nécessaire. (Je suis en vb.net avec .net 4.0, et il ne me laisse pas appeler New ToolStripMenuItem() puisqu'il a un MustInherit balise, j'ai donc fait 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
répondu QuickDanger 2013-03-28 22:53:19

Vous pouvez simplement passer null pour l'image.

Menu.DropDownItems.Add(Text, null, EventHandler);
0
répondu John 2016-11-15 16:23:54