我想使用以下代码向表单中的所有标签添加click,mouseleave和mouseenter事件。但是我在form_load上调用addeventtoalllabels,但不会将事件添加到标签中。
public void setColor()
{
if (clickedLabel != default(Label))
clickedLabel.BackColor = Color.Yellow;
//Resetting clicked label because another (or the same) was just clicked.
}
void addeventtoalllabels()
{
foreach (Label c in this.Controls.OfType<Label>())
{
try
{
c.Click += (sender, e) => {
setColor();
Label theLabel = (Label)sender;
clickedLabel = theLabel;
};
c.MouseEnter += (sender, e) =>
{
Label theLabel = (Label)sender;
if (theLabel != clickedLabel)
theLabel.BackColor = Color.Red;
};
c.MouseLeave += (sender, e) =>
{
Label theLabel = (Label)sender;
if (theLabel != clickedLabel)
theLabel.BackColor = Color.Yellow;
};
}
catch { }
}
}
答案 0 :(得分:0)
听起来像是问题在于您的某些标签在其他容器控件内,所以当您执行this.Controls.OfType<Label>()
时,它们不会被迭代(所有Control
对象都有一个{{1} }集合。
解决此问题的一种方法是递归浏览所有控件的Controls
集合,以便您可以找到属于其他容器控件的子Controls
对象。
下面是3种方法:
Label
接受一个AddEventsToLabel
控件并向其中添加事件。Label
接受一个AddEventsToChildLabels
参数,并检查它是否为Control
。如果是,则将其传递给上面#1中的方法。否则,它将递归地为传入的控件的每个子控件进行调用。Label
用于启动进程-此方法调用上面#2中的方法,并将AddEventsToAllLabels
本身作为父控件(Form
)传递。通过这种方式,我们最终遍历了表单上的每个控件,包括其他容器控件内的所有控件:
this
请注意,最好在添加事件处理程序之前先 删除 ,以防万一此方法被多次调用。否则,如果您多次将同一事件处理程序钩接到同一事件,则每次引发该事件时,处理程序都会执行添加该事件的次数。
例如:
private void AddEventsToAllLabels()
{
AddEventsToChildLabels(this);
}
private void AddEventsToChildLabels(Control parent)
{
if (parent is Label)
{
AddEventsToLabel(parent as Label);
}
else
{
foreach (Control control in parent.Controls)
{
AddEventsToChildLabels(control);
}
}
}
private void AddEventsToLabel(Label label)
{
label.Click += (sender, e) => {
SetColor();
Label theLabel = (Label)sender;
clickedLabel = theLabel;
};
label.MouseEnter += (sender, e) =>
{
Label theLabel = (Label)sender;
if (theLabel != clickedLabel) theLabel.BackColor = Color.Red;
};
label.MouseLeave += (sender, e) =>
{
Label theLabel = (Label)sender;
if (theLabel != clickedLabel) theLabel.BackColor = Color.Yellow;
};
}