如何访问以编程方式创建的计时器控件?

时间:2014-09-11 10:36:28

标签: c# winforms timer custom-controls programmatically-created

在WinForms(C#)应用程序中,我在运行时创建了几个自定义控件。这些自定义控件称为JobTimers,并继承/扩展标准控件Timer。

public class JobTimer : System.Windows.Forms.Timer
{
    private int IntJobID;
    public int JobID
    {
        get{return IntJobID;}
        set{IntJobID = value;}
    }
}

public static void CreateTimer(int JobID) 
{
    JobTimer ControlJobTimer = new JobTimer();
    ControlJobTimer.Enabled = true;
    ControlJobTimer.JobID = JobID;
    ControlJobTimer.Interval = 30000;
    ControlJobTimer.Tick += new EventHandler(JobTimer_Tick);
    ControlJobTimer.Start(); 
}

类似于我们如何查询表单上的标准或自定义控件的集合 - 我们可以访问/查询这些自定义JobTimer控件的集合吗?

注意:出现此问题的原因是我没有看到这些控件停靠/放置在任何表单中,因此仅存在于程序的内存中。在停止/退出应用程序时,这些控件也消失了。

换句话说,如何获取应用程序中所有计时器的列表以及对其属性的访问权限?

3 个答案:

答案 0 :(得分:0)

    public static List<JobTimer> _timers;

    public class JobTimer : System.Windows.Forms.Timer
    {
        private int IntJobID;
        public int JobID
        {
            get { return IntJobID; }
            set { IntJobID = value; }
        }
    }

    public static void CreateTimer(int JobID)
    {
        if (_timers == null)
        {
            _timers = new List<JobTimer>();
        }
        JobTimer ControlJobTimer = new JobTimer();
        ControlJobTimer.Enabled = true;
        ControlJobTimer.JobID = JobID;
        ControlJobTimer.Interval = 30000;
        ControlJobTimer.Tick += new EventHandler(JobTimer_Tick);
        ControlJobTimer.Start();
        _timers.Add(ControlJobTimer);
    }

然后你可以访问全局列表_timers,所有创建的jobtimer实例都将被添加到那里

答案 1 :(得分:0)

这段代码闻起来。来自计时器的派生自定义控件是实现您想要的非常昂贵的方式。您可以使用线程,后台工作程序,订阅/发布模型,而不是更优化。

我们可以访问/查询这些自定义JobTimer控件的集合吗?

简单,当您声明JobTimers在父表单中保持对它们的访问时,例如:

List<JobTimer> jobTimers = new List<JobTimer>();

答案 2 :(得分:0)

正如其他人已经说过的那样,你必须自己保存并保存安全的定时器。没有AllTimers集合,因此您必须创建和管理一个。

子类化Timer是个坏主意。这可能是更合适,更容易扩展的版本:

using System.Windows.Forms;

public class JobTimer
{
    public Timer Timer {get; set;}
    public string ID {get; set;}
}

public List<JobTimer> _timers = new List<JobTimer>();

public static void CreateTimer(int id) 
{
    var timer = new Timer() { Interval = 30000 };
    var job = new JobTimer() { Timer = timer, ID = id };
    _timers.Add(job);
    timer.Tick += JobTimer_Tick;
    timer.Start(); 
}

public static void DisposeTimers()
{
    foreach(var timer in _timers)
        timer.Dispose();
}