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,出现了轻微的语法错误。我使用了第一种方法