web-dev-qa-db-fra.com

C # ajouter dynamiquement un gestionnaire d'événements

Salut, j'ai une question simple. voici mon code:

        XmlDocument xmlData = new XmlDocument();
        xmlData.Load("xml.xml");

        /* Load announcements first */
        XmlNodeList announcements = xmlData.GetElementsByTagName("announcement");

        for (int i = 0; i < announcements.Count; i++)
        {
            ToolStripMenuItem item = new ToolStripMenuItem();

            item.Name = announcements[i].FirstChild.InnerText;
            item.Text = announcements[i].FirstChild.InnerText;

            /* HERE IS WERE I NEED HELP */

            item.Click += new EventHandler();

            this.freedomMenu.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { item });
        }

Le xml LastChild contient des informations pour chaque annonce. Je voudrais créer un gestionnaire d'événements de clic où, lorsque l'élément de liste est cliqué, une boîte de message s'affiche avec les données à l'intérieur. Mon problème est que je ne sais pas comment générer dynamiquement des gestionnaires d'événements pour ce faire :(

21
Tony

essayer:

 /* HERE IS WERE I NEED HELP */

 item.Click += new EventHandler(toolStripClick);

gestionnaire réel:

void toolStripClick(object sender, EventArgs e)
{
     ToolStripItem item = (ToolStripItem)sender;
     MessageBox.Show(item.Text);
}    
39
TheVillageIdiot

Vous pouvez utiliser la propriété Tag de ToolStripMenuItem:

item.Tag = Announcements[i].LastChild.InnerText;

public void item_click(object sender, EventArgs e)
{
    var menu = sender as ToolStripMenuItem;
    if (menu!= null)
        MessageBox.Show(menu.Tag);
}

Ou vous pouvez utiliser un lambda, qui capturera la variable:

string data = Announcements[i].LastChild.InnerText;
item.Click += (s, e) => { MessageBox.Show(data); };
6
Steven Robbins

Eh bien, si je comprends bien votre question, votre section "Besoin d'aide" devrait devenir ceci:

item.Click += new EventHandler(item_click);

alors il vous suffit d'ajouter une fonction à votre classe:

public void item_click(object sender, EventArgs e)
{
   //do stuff here
}
2
Streklin

demandez-vous la signature de l'événement click? si vous travaillez dans visual studio, vous devriez pouvoir taper

item.Click + = tab tab

et ça va générer quelque chose pour vous

2
lincolnk

Je recommanderais que vous examiniez les abonnements aux événements. Dans le cas où vous devez vous assurer qu'il s'agit du dernier élément de l'élément de menu.
Consultez l'aide de MSDN pour l'article

0
mcauthorn