我想使用下面的代码向表单中的所有标签添加 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 { }
}
}
听起来问题在于您的某些标签位于其他容器控件内,因此当您这样做时它们不会被迭代this.Controls.OfType<Label>()
(所有Control
对象都有一个Controls
集合)。
解决此问题的一种方法是递归查看所有控件的Controls
集合,以便您可以找到Label
属于其他容器控件的子对象。
下面是3种方法:
AddEventsToLabel
接收一个Label
控件并向其添加事件。AddEventsToChildLabels
接受一个Control
参数并检查它是否是Label
. 如果是,它将它传递给上面#1 中的方法。否则,它会为传入的每个子控件递归调用自己。AddEventsToAllLabels
用于启动进程 - 此方法调用上面#2 中的方法,将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;
};
}
请注意,最好先删除事件处理程序,然后再添加它,以防多次调用此方法。否则,如果您多次将同一个事件处理程序挂接到同一个事件,每次引发该事件时,处理程序将执行它添加的次数。
例如:
private void AddEventsToLabel(Label label)
{
label.Click -= LabelClick;
label.MouseEnter -= LabelMouseEnter;
label.MouseLeave -= LabelMouseLeave;
label.Click += LabelClick;
label.MouseEnter += LabelMouseEnter;
label.MouseLeave += LabelMouseLeave;
}
private void LabelClick(object sender, EventArgs e)
{
SetColor();
Label theLabel = (Label)sender;
clickedLabel = theLabel;
}
private void LabelMouseEnter(object sender, EventArgs e)
{
Label theLabel = (Label)sender;
if (theLabel != clickedLabel) theLabel.BackColor = Color.Red;
}
private void LabelMouseLeave(object sender, EventArgs e)
{
Label theLabel = (Label)sender;
if (theLabel != clickedLabel) theLabel.BackColor = Color.Yellow;
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句