2014-02-05 5 views
1

Я хочу передать некоторые параметры событию timer_tick в C#, но я не хочу делать их глобальными переменными. Это возможно?Передача параметров на событие timer_Tick

Я был осмотреться и придумал что-то вроде этого:

//Where I start the timer 
lift1Up.Enabled = true; 
lift1Up.Tick += (sender, args) => lift1Up_Tick(sender, args, destination, currentFloor); 
lift1Up.Start(); 

private void lift1Up_Tick(object sender, EventArgs e, int dest, int current) 
{ 
    //my code  
} 

Большое спасибо! Люк.

ответ

1

Да, но не так. Вы можете определить класс, унаследовав от EventArgs

class MyEventArgs : EventArgs 
{ 
    public int dest { get; set; } 
    public int current { get; set; } 
} 

Затем вам необходимо вручную запустить Tick событие и передать параметры как это:

lift1Up_Tick(this, new MyEventArgs { dest = 23, current = 100 }); 

И в случае клеща вы можете получить эти аргументы:

private void lift1Up_Tick(object sender, EventArgs e) 
{ 
    var args = (MyEventArgs)e; 
    int dest = args.dest;  
} 

Я не знаю, есть ли лучший способ. Для этого (мануальный триггер) вы можете добавить еще один таймер. Установите его интервал, затем напишите этот код внутри его отметки Событие:

lift1Up_Tick(this, new MyEventArgs { dest = 23, current = 100 }); 
+0

Это прекрасно работает, спасибо большое. Luke. – user3277329

0

Да, вы можете использовать функции лямбда, используемый в примере, приведенном. Лямбда-функции являются формой вложенной функции, поскольку они позволяют доступ к переменным в объеме содержащейся функции. лямбда-выражение определяется как:

(input parameters) => expression; 
(input parameters) => {statement block}; 

Таким образом, вы можете выполнить любое выражение или блок операторов, как метод вызова, с видимостью всех переменной сферы, в том числе переменных событий, без необходимости, чтобы сделать их глобальными переменными.

1

Вы можете просто использовать лямбда для обработчика событий, и получить доступ к локальным переменным из там, C# компилятор будет делать магию:

void StartTimer() 
{ 
    EventHandler tickHandler = null; 

    var destination = 5, currentFloor = 0; 

    tickHandler = (sender, args) => 
    { 
     if (currentFloor == destination) 
     { 
      lift1Up.Enabled = false; 
      lift1Up.Tick -= tickHandler; 

      MessageBox.Show("Arrived!"); 
     } 
     else 
      currentFloor++; 
    } 

    // start the timer 
    lift1Up.Tick += tickHandler; 
    lift1Up.Enabled = true; 
} 
Смежные вопросы