Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#动态添加事件处理程序_C#_Events_Event Handling_Click - Fatal编程技术网

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非常有用,我在搜索,而不是创建另一个方法,只是一行解决方案。