Tony
Tony

Reputation: 253

C# dynamically add event handler

Hi i have a simple question. here is my 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 });
        }

The xml LastChild holds information for each annoucement. I would like to create a click event handler where when teh list item is clicked, a message box shows up with the data inside it. My problem is i dont no how to dynamically generate event handlers to do this :(

Upvotes: 25

Views: 86691

Answers (6)

i Mr Oli i
i Mr Oli i

Reputation: 755

For people who stumble across this question now:

I simply do this:

public Form1() {
item.Click += item_Click;
}

private void item_Click(object sender, EventArgs e) {
// Code in here
}

Visual Studio can save you the hassle, though. After you type item.Click +=, it'll auto-populate once you press tab.

Example

Upvotes: 1

Steven Robbins
Steven Robbins

Reputation: 26599

You could use the Tag property of the 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);
}

Or you could use a lambda, which will capture the variable:

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

Upvotes: 6

TheVillageIdiot
TheVillageIdiot

Reputation: 40512

try:

 /* HERE IS WERE I NEED HELP */

 item.Click += new EventHandler(toolStripClick);

actual handler:

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

Upvotes: 44

lincolnk
lincolnk

Reputation: 11238

are you asking for the signature for the click event? if you're working in visual studio, you should be able to type

item.Click+= tab tab

and it'll generate something for you

Upvotes: 2

mcauthorn
mcauthorn

Reputation: 598

I would recommend you look into subscriptions for events. In the event you have to make sure it's the last item in the menu item.
Look at MSDN's help for the item

Upvotes: 0

Streklin
Streklin

Reputation: 849

Well, if I understand your question correctly, your "needs help" section should become this:

item.Click += new EventHandler(item_click);

then you just need to add a function to your class:

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

Upvotes: 2

Related Questions