【问题标题】:event for runtime controls in c#c#中运行时控件的事件
【发布时间】:2015-06-08 19:55:02
【问题描述】:

我尝试在运行时创建一个控件(不是一个,“n”个运行时控件) 但现在我想为每个控件创建事件 我做了一个,但它只适用于我在运行时创建的最后一个控件 如何为每个控件创建事件?

        private void CreateRuntimeControl(PictureBox pic)
    {
        lbl = new Label();
        number++;
        locationX = locationX + 20;
        locationY = locationY + 20;
        lbl.Name = number.ToString();
        lbl.Size = new System.Drawing.Size(30, 20);
        lbl.Location = new System.Drawing.Point(10 + locationX, 10 + locationY);
        lbl.Text = number.ToString();
        lbl.BackColor = Color.Gray;
        pic.Controls.Add(lbl);
        lbl.MouseDown += lbl_MouseDown;
    }

和事件

        private void lbl_MouseDown(object sender, MouseEventArgs e)
    {
        MessageBox.Show(lbl.Name);
    }

最好的问候

【问题讨论】:

  • 试试 lbl.MouseDown += lbl_MouseDown;
  • 什么意思?你能解释一下吗?
  • 你不应该每次都实例化一个新的 EventHandler,而只是订阅你已经拥有的。
  • 这就是我在顶部编写的代码,当我每次通过单击按钮添加标签时,当我单击它们时,它只会显示最后一个标签而不是我单击的标签
  • 如果您仅引用最后一个创建的标签,请查看 noMad17 的答案

标签: c# events runtime controls


【解决方案1】:

当您创建标签时。这样做lbl.MouseDown += lbl_MouseDown; 然后在您的 EventHandler 中:

MessageBox.Show(((Label)sender).Name);

澄清; sender 将是触发事件的对象,因此您需要将其强制转换为 Label,然后您才能使用其属性。

【讨论】:

  • 欢迎接受答复,以便我们知道您的问题已解决。
【解决方案2】:

您的lbl_MouseDown 方法中的lbl 是什么?如果它是一个类范围的成员字段,您将其用作刚刚创建的标签对象的临时存储,那么您会遇到相当预期的行为。请改用您方法的 sender 参数。

【讨论】:

    【解决方案3】:

    您可以为此使用closure。它使您的代码保持整洁。

    像这样:

    var lbl = new Label();
    lbl.MouseDown += (s,e) => this.HandleMouseDownOnLabel(lbl);
    
    private void HandleMouseDownOnLabel(Label lbl)
    {
        Messagabox.Show(lbl.Name);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-10-07
      • 1970-01-01
      • 1970-01-01
      • 2019-04-04
      • 1970-01-01
      • 2012-04-23
      • 2019-12-26
      相关资源
      最近更新 更多