仅在正确的用户控件上触发事件
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
}
或者您可以通过订阅用户控件 Enter
和 Leave
事件
取消订阅并在焦点更改时订阅
Monat.Enter += (s, e) => OnSetUrlaub += ((ucMonat)s).getSelectedCells;
Monat.Leave += (s, e) => OnSetUrlaub -= ((ucMonat)s).getSelectedCells;
这样只有活跃的 ucMonat
才能获得事件。
我有以下场景,我有一个 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
}
或者您可以通过订阅用户控件 Enter
和 Leave
事件
Monat.Enter += (s, e) => OnSetUrlaub += ((ucMonat)s).getSelectedCells;
Monat.Leave += (s, e) => OnSetUrlaub -= ((ucMonat)s).getSelectedCells;
这样只有活跃的 ucMonat
才能获得事件。