【问题标题】:C# dynamically add event handlerC#动态添加事件处理程序
【发布时间】:2010-12-04 15:12:17
【问题描述】:

您好,我有一个简单的问题。这是我的代码:

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

【问题讨论】:

    标签: c# events event-handling click


    【解决方案1】:

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

    我只是这样做:

    public Form1() {
    item.Click += item_Click;
    }
    
    private void item_Click(object sender, EventArgs e) {
    // Code in here
    }
    

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 我创建的 Lambda 对我很有帮助,我一直在寻找,而不是创建另一种方法,只是一个线解决方案。
      【解决方案3】:

      尝试:

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

      【讨论】:

      • 我以为你想让 LastChild 出现在消息框中?那会显示 FirstChild?
      • 我不知道我是否在想象,但我发现即使没有“新的 EventHandler,它也可以工作,例如 item.Click+=itemClick; 我只是尝试将面板添加到表单并执行面板.Click+=p_click;来自 wonky79 的想法 stackoverflow.com/questions/17047355/…
      • @barlop 确定你做对了。可能当最初回答这个问题时,添加事件处理程序的方式不存在,或者我只是把它作为常规方式。 item.Click += itemClick 是答案中表达的语法糖。
      【解决方案4】:

      您是否要求点击事件的签名?如果你在 Visual Studio 工作,你应该可以输入

      item.Click+= 标签标签

      它会为你生成一些东西

      【讨论】:

        【解决方案5】:

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

        【讨论】:

          【解决方案6】:

          好吧,如果我正确理解了您的问题,您的“需要帮助”部分应该是这样的:

          item.Click += new EventHandler(item_click);
          

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

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

          【讨论】:

          • 是的,但这就是我卡住的地方。如何将数据从 xml LastChild 发送到该函数?
          • 啊 - 我没有意识到那部分 - 虽然你已经可以看到答案已经给出 - 当你创建一个事件处理程序时,产生事件的对象(或在这种情况下被点击)是发送者参数。一般来说,您只需将其转换为正确的数据类型并继续您的快乐方式。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2017-03-15
          • 1970-01-01
          • 2014-07-06
          • 2020-03-06
          • 2016-06-06
          • 2011-04-25
          • 1970-01-01
          相关资源
          最近更新 更多