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

C# 仅在正确的用户控件上触发事件,c#,events,user-controls,C#,Events,User Controls,我有以下场景,我有一个TabControl,其中每个TabPage代表一年。每年-TabPage我都会有另一个TabControl和12个TabPage月份。每个月-TabPage我都有一个UserControl。我是这样做的: foreach (TabPage tp2 in tbMonat.TabPages) { ucMonat Monat = new ucMonat(Convert.ToInt32(tp.Name), Convert.T

我有以下场景,我有一个
TabControl
,其中每个
TabPage
代表一年。每年-
TabPage
我都会有另一个
TabControl
和12个
TabPage
月份。每个月-
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);
            }
在我的主窗体上有一个
按钮
,如果按下该
按钮
,则
事件
将在
用户控件
上触发。但此时,事件会在每个
UserControl
上触发。我只想在当前活动的
UserControl
上启动它。我该怎么做

MainForm:

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;
    }
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
}
或者,通过订阅用户控件
Enter
Leave
事件,您可以在焦点更改时取消订阅和订阅

Monat.Enter += (s, e) => OnSetUrlaub += ((ucMonat)s).getSelectedCells;
Monat.Leave += (s, e) => OnSetUrlaub -= ((ucMonat)s).getSelectedCells;

因此,只有活动的
ucMonat
才能获取事件。

foreach
中的订阅/取消订阅部分吗?如果是这样的话,我会得到一个错误提示:只能将赋值、调用、递增、递减和新对象表达式用作statement@E-抱歉,由于没有使用IDEI,出现了轻微的语法错误。我使用了第一种方法