2015-06-08 45 views
-1

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

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

问候

+0

尝试lbl.MouseDown + = lbl_MouseDown; – noMad17

+0

你是什么意思?你能解释一下吗? – Salmani

+0

您不应该每次都实例化一个新的EventHandler,而只需订阅您已拥有的那个。 – noMad17

回答

4

当您创建的标签。在你的事件处理程序做到这一点lbl.MouseDown += lbl_MouseDown; 然后:

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

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

+0

谢谢我不知道它和它的一个很好的答案 – Salmani

+0

随时接受一个答案,以便我们知道你的问题已经解决。 – noMad17

0

您的lbl_MouseDown方法中的lbl是什么?如果它是一个全班级的成员字段,您用它作为临时存储器创建了标签对象,那么您会遇到相当期望的行为。相反,请使用您的方法的sender参数。

+0

谢谢你解释我,我不知道,非常感谢你 – Salmani

0

您可以使用closure。它使您的代码更加干净。

像这样:

var lbl = new Label(); 
lbl.MouseDown += (s,e) => this.HandleMouseDownOnLabel(lbl); 

private void HandleMouseDownOnLabel(Label lbl) 
{ 
    Messagabox.Show(lbl.Name); 
}