C#动态添加事件处理程序
嗨,我有一个简单的问题。这是我的密码:C#动态添加事件处理程序,c#,events,event-handling,click,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
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 });
}
XmlDocument xmlData=new XmlDocument();
Load(“xml.xml”);
/*首先加载公告*/
XmlNodeList announcements=xmlData.GetElementsByTagName(“公告”);
for(int i=0;i
xml LastChild保存每个注释的信息。我想创建一个单击事件处理程序,当单击列表项时,会显示一个消息框,其中包含数据。我的问题是我不知道如何动态生成事件处理程序来实现这一点:(好吧,如果我正确理解了您的问题,您的“需要帮助”部分应该是:
item.Click += new EventHandler(item_click);
然后,您只需向类中添加一个函数:
public void item_click(object sender, EventArgs e)
{
//do stuff here
}
我建议您查看活动订阅。在活动中,您必须确保它是菜单项中的最后一项。
您是否要求单击事件的签名?如果您在visual studio中工作,您应该能够键入 项目。单击+=选项卡 它将为您生成一些内容尝试:
/* 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的标记属性:
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); };
是的,但这正是我陷入困境的地方。我如何将数据从xml LastChild发送到该函数?啊-我没有意识到这一部分-尽管你已经看到答案了-当你创建一个事件处理程序时,这个对象产生了事件(或者在本例中被单击)是sender参数。一般来说,您只需要将其转换为正确的数据类型,然后继续您的快乐之路。我以为您希望LastChild出现在messagebox中?这将显示FirstChild?我不知道我是否在想象,但我发现即使没有"新建EventHandler,仅使用例如
项。单击+=itemClick;
我刚刚尝试将一个面板添加到表单和执行面板。单击+=p\u单击;wonky79的想法@barlop这里确保您的想法是正确的。可能在最初回答此问题时,添加EventHandler的方法不存在,或者我只是将其作为常规方法使用。item.Click+=itemClick
是答案中表达式的语法糖。我发现Lambda非常有用,我在搜索,而不是创建另一个方法,只是一行解决方案。