仅在正确的用户控件上触发事件

Only fire the event on the correct User Control

我有以下场景,我有一个 TabControl,其中每个 TabPage 代表一年。在每年 - TabPage 我有另一个 TabControl 和 12 TabPages 是月份。每个月-TabPage 我都有一个 UserControl。我这样做:

foreach (TabPage tp2 in tbMonat.TabPages)
            {
                ucMonat Monat = new ucMonat(Convert.ToInt32(tp.Name), Convert.ToInt32(tp2.Name));
                Monat.Parent = this;
                OnSetUrlaub += Monat.getSelectedCells;
                Monat.Dock = DockStyle.Fill;
                tp2.Controls.Add(Monat);
            }

在我的 MainForm 上我有一个 Button,如果 Button 被按下,Event 就会在 UserControl 上触发。但目前事件每 UserControl 触发一次。我只想在当前活动的 UserControl 上触发它。我该怎么做?

主窗体:

public delegate void SetUrlaub(string Date, EventArgs e);
    public event SetUrlaub OnSetUrlaub;

public void cmdUrlaub_Click(object sender, EventArgs e)
    {            
        if (OnSetUrlaub != null)
            OnSetUrlaub(Jahr + Monat , e);
    }

用户控件:

public void getSelectedCells(string sender, EventArgs e)
    {
        int Year = Convert.ToInt32(sender.Substring(0, 4));
        int Month = Convert.ToInt32(sender.Substring(4));

        int numCells = this.dgvUrlaub.SelectedCells.Count;
    }

事件处理程序没有那样的选择性。每个订阅者都会在事件引发时收到该事件,并且您的所有用户控件都订阅了同一事件。

您可以在收到事件时进行过滤

if (this.Focused)
{
   //Do stuff only the active control should do
}

或者您可以通过订阅用户控件 EnterLeave 事件

取消订阅并在焦点更改时订阅
Monat.Enter += (s, e) => OnSetUrlaub += ((ucMonat)s).getSelectedCells;
Monat.Leave += (s, e) => OnSetUrlaub -= ((ucMonat)s).getSelectedCells;

这样只有活跃的 ucMonat 才能获得事件。