我有以下情景,我有一个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
上被触发。我怎么能这样做?
的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;
}
答案 0 :(得分:0)
事件处理程序不是那种选择性的。每个订阅者都会在募集事件和所有用户控件订阅同一事件时收到该事件。
您可以在收到活动时进行过滤
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
才能获得该事件。