我不确定这是不是一个好主意,而这可能最终会成为更多的学术活动,所以请耐心等待:
假设我正在制作UserControl(就像我一样),每隔X秒(使用一个Timer)查找一个文本文件并在此UserControl中显示该信息。我们将此控件称为MyUserControl。
重新基础:
我将此Timer作为此控件的成员变量,并具有如下代码:
this.timer1.Tick += new System.EventHandler(this.timer1_Tick);
一个看起来像这样的事件处理程序方法:
private void timer1_Tick(object sender, EventArgs e)
{
// Read text-file and do lots of goodness.
}
很酷,所以现在我可以将MyUserControl的公共属性设置为一些已用的时间,只需将此控件放在我的Form上,我就会有一个很好的小控件更新自己。整齐。
这让我很好奇:
表格我要打开它已经有一个计时器。那么为什么有两个竞争计时器呢?我希望有一种方法可以让MyUserControl只在需要时使用它的内部计时器(例如,将它放在另一个没有Timer的Form上)。
我想我可以在这里公开MyUserControl timer1_Tick:
public void timer1_Tick(object sender, EventArgs e)
{
// Read text-file and do lots of goodness.
}
然后,因为这些东西是多播的,所以在这里做一些类似的事情:
this.theFormTimer.Tick += new System.EventHandler(this.theFormTimer_Tick);
this.theFormTimer.Tick += new System.EventHandler(MyUserControlObject.timer1_Tick);
并且还设置MyUserControl的成员变量以不启用它自己。
但是有一些更明智的方式吗?我能否以某种方式确定MyUserControl中的事件处理程序方法是否已连接到Form Timer的tick事件?或者使用其他类型的方法而不是我的建议?
谢谢! (道歉,如果这最终成了重复,我的google-fu今天可能会很糟糕)
答案 0 :(得分:1)
不讨论你是否应该这样做,但要回答这个问题,我会这样做:
//add a handler
timer.Tick += timer_tick;
//...
//check if timer_tick is wired to Tick
if (timer.Tick.GetInvocationList().Contains (timer_tick))
{
//do something
}
我没有测试过,但这就是我要尝试的。