Как получить доступ к программно созданным элементам управления таймером?

В приложении 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?

ПРИМЕЧАНИЕ. Причина появления этого вопроса заключается в том, что я не вижу, чтобы эти элементы управления закреплялись / помещались в какую-либо из форм, тем самым существуя исключительно в памяти программы. Также при остановке / выходе из приложения эти элементы управления исчезают.

Другими словами, как получить список всех таймеров в приложении вместе с доступом к их свойствам?


person prgSRR    schedule 11.09.2014    source источник
comment
Вы получите список таймеров, создав List<Timer>. Как вам ударить ногой в открытую дверь;) То, что у вас есть сейчас, не дает вам никакого приличного способа получить обратную ссылку на объект таймера. У вас была одна, но это просто локальная переменная, которая гонзо после возврата CreateTimer (). Все, что осталось, - это аргумент sender в обработчике события Tick. Используйте список.   -  person Hans Passant    schedule 11.09.2014


Ответы (3)


    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 будут добавлены туда

person user1519979    schedule 11.09.2014
comment
Спасибо за решение. Не могли бы вы пролить свет на эту часть: if (_timers == null) {_timers = new List ‹JobTimer› (); } - person prgSRR; 11.09.2014
comment
это просто создание экземпляра списка, если _timers не назначен, тогда вам нужно создать новый список, иначе он уже создан и ничего не делается. вы также можете сделать это в начале программы, тогда вам не понадобится оператор if в CreateTimer. Например. вы можете создать экземпляр в событии form_load (msdn.microsoft.com/en-us//library/) -› _timers = new List ‹JobTimer› (); - person user1519979; 11.09.2014
comment
@ user1519979 просто любопытно, почему вы не создали экземпляр списка при его объявлении? - person Jeremy Thompson; 12.09.2014

Этот код пахнет. Пользовательские элементы управления, производные от таймеров, - действительно дорогой способ добиться желаемого. Вместо этого вы можете использовать потоки, фоновые рабочие процессы, модели подписки / публикации, которые были бы намного более оптимальными.

Можно ли получить доступ к коллекции этих настраиваемых элементов управления JobTimer или запросить ее?

Просто, когда вы объявляете JobTimers, они сохраняют доступ к ним в родительской форме, например:

List<JobTimer> jobTimers = new List<JobTimer>();
person Jeremy Thompson    schedule 11.09.2014
comment
Спасибо за решение. Я бы начал использовать потоки, фоновые рабочие и т. Д., Когда стану опытным в этих областях ... :) - person prgSRR; 11.09.2014
comment
Хорошо, пообещай мне, что постараешься попробовать background workerexample. Сейчас я дам +5 баллов, чтобы вы могли проголосовать за Stack Overflow в ожидании, что взамен вы предложите лучшие решения. - person Jeremy Thompson; 11.09.2014
comment
Вы держите пари .. !!! :) Я уже читаю о вспомогательных работниках и обязательно найду их в следующих проектах. Спасибо за руководство. - person prgSRR; 11.09.2014

Как уже говорили другие, вы должны сами сохранять и хранить в безопасности созданные таймеры. Коллекции 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();
}
person Sinatr    schedule 11.09.2014
comment
Спасибо за решение. Создание унаследованного класса было единственным известным мне способом добавления настраиваемых свойств. Я тоже попробую. - person prgSRR; 11.09.2014