C#动态添加事件处理程序

时间:2009-10-07 13:18:11

标签: c# events event-handling click

嗨我有一个简单的问题。这是我的代码:

        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保存每个公告的信息。我想创建一个单击事件处理程序,当单击列表项时,会显示一个消息框,其中包含数据。我的问题是我不知道如何动态生成事件处理程序来执行此操作:(

6 个答案:

答案 0 :(得分:39)

尝试:

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

答案 1 :(得分:5)

您可以使用ToolStripMenuItem的Tag属性:

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

或者您可以使用lambda,它将捕获变量:

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

答案 2 :(得分:2)

好吧,如果我理解你的问题,你的“需要帮助”部分应该成为:

item.Click += new EventHandler(item_click);

然后你只需要在你的班级中添加一个函数:

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

答案 3 :(得分:2)

您要求点击事件的签名吗?如果你在visual studio工作,你应该能够输入

item.Click + =标签标签

它会为你生成一些东西

答案 4 :(得分:0)

我建议您查看订阅活动。如果您必须确保它是菜单项中的最后一项 Look at MSDN's help for the item

答案 5 :(得分:0)

对于现在偶然发现这个问题的人:

我只是这样做:

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

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

不过,Visual Studio 可以为您省去麻烦。输入 item.Click += 后,它会在您按下 Tab 键后自动填充。

Example