将事件添加到表单中的所有标签

时间:2019-06-10 21:39:10

标签: c# .net

我想使用以下代码向表单中的所有标签添加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 { }


            }

        }

1 个答案:

答案 0 :(得分:0)

听起来像是问题在于您的某些标签在其他容器控件内,所以当您执行this.Controls.OfType<Label>()时,它们不会被迭代(所有Control对象都有一个{{1} }集合。

解决此问题的一种方法是递归浏览所有控件的Controls集合,以便您可以找到属于其他容器控件的子Controls对象。

下面是3种方法:

  1. Label接受一个AddEventsToLabel控件并向其中添加事件。
  2. Label接受一个AddEventsToChildLabels参数,并检查它是否为Control。如果是,则将其传递给上面#1中的方法。否则,它将递归地为传入的控件的每个子控件进行调用。
  3. 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;

    };
}