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

时间:2015-05-12 08:24:21

标签: c# events user-controls

我有以下情景,我有一个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,如果按下ButtonEvent会触发UserControl。但是在片刻,每个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;
    }

1 个答案:

答案 0 :(得分:0)

事件处理程序不是那种选择性的。每个订阅者都会在募集事件和所有用户控件订阅同一事件时收到该事件。

您可以在收到活动时进行过滤

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才能获得该事件。