c#中运行时控件的事件
event for runtime controls in c#
我尝试在运行时制作一个控件(不是一个,"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;
然后在你的事件处理程序中:
MessageBox.Show(((Label)sender).Name);
澄清; sender
将是触发事件的对象,因此您需要将其转换为 Label 然后才能使用其属性。
你的lbl_MouseDown
方法中的lbl
是什么?如果它是一个 class 宽的成员字段,您将其用作刚刚创建的标签对象的临时存储,那么您会遇到非常预期的行为。请改用方法的 sender
参数。
您可以为此使用 closure。它使您的代码保持整洁。
像这样:
var lbl = new Label();
lbl.MouseDown += (s,e) => this.HandleMouseDownOnLabel(lbl);
private void HandleMouseDownOnLabel(Label lbl)
{
Messagabox.Show(lbl.Name);
}
我尝试在运行时制作一个控件(不是一个,"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;
然后在你的事件处理程序中:
MessageBox.Show(((Label)sender).Name);
澄清; sender
将是触发事件的对象,因此您需要将其转换为 Label 然后才能使用其属性。
你的lbl_MouseDown
方法中的lbl
是什么?如果它是一个 class 宽的成员字段,您将其用作刚刚创建的标签对象的临时存储,那么您会遇到非常预期的行为。请改用方法的 sender
参数。
您可以为此使用 closure。它使您的代码保持整洁。
像这样:
var lbl = new Label();
lbl.MouseDown += (s,e) => this.HandleMouseDownOnLabel(lbl);
private void HandleMouseDownOnLabel(Label lbl)
{
Messagabox.Show(lbl.Name);
}