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

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

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

尝试:

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

您可以使用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); }; 

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

 item.Click += new EventHandler(item_click); 

那么你只需要在你的类中添加一个函数:

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

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

item.Click + = tab选项卡

它会为你生成一些东西

我建议你研究订阅事件。 如果您必须确保它是菜单项中的最后一项。
查看MSDN对该项目的帮助