C # динамически добавлять обработчик событий - PullRequest
21 голосов
/ 07 октября 2009

Привет, у меня простой вопрос. вот мой код:

        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 });
        }

xml LastChild содержит информацию для каждого объявления. Я хотел бы создать обработчик события щелчка, где при нажатии на элемент списка появляется окно сообщения с данными внутри него. Моя проблема в том, что я не умею динамически генерировать обработчики событий для этого: (

Ответы [ 5 ]

39 голосов
/ 07 октября 2009

попробовать:

 /* HERE IS WERE I NEED HELP */

 item.Click += new EventHandler(toolStripClick);

фактический обработчик:

void toolStripClick(object sender, EventArgs e)
{
     ToolStripItem item = (ToolStripItem)sender;
     MessageBox.Show(item.Text);
}    
5 голосов
/ 07 октября 2009

Вы можете использовать свойство Tag 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);
}

Или вы можете использовать лямбду, которая будет захватывать переменную:

string data = Announcements[i].LastChild.InnerText;
item.Click += (s, e) => { MessageBox.Show(data); };
2 голосов
/ 07 октября 2009

вы запрашиваете подпись для события click? если вы работаете в visual studio, вы должны набрать

item.Click + = tab tab

и это сгенерирует что-то для вас

2 голосов
/ 07 октября 2009

Ну, если я правильно понимаю ваш вопрос, ваш раздел "нужна помощь" должен выглядеть так:

item.Click += new EventHandler(item_click);

тогда вам просто нужно добавить функцию в ваш класс:

public void item_click(object sender, EventArgs e)
{
   //do stuff here
}
0 голосов
/ 07 октября 2009

Я бы порекомендовал вам посмотреть подписки на события. Если вам нужно убедиться, что это последний элемент в пункте меню.
Посмотрите на справку MSDN для элемента

...