2014-02-05 150 views
1

我想將某些參數傳遞給c#中的事件timer_tick,但我不想讓它們成爲全局變量。這可能嗎?將參數傳遞給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;  
} 

我不知道是否有更好的方法。要做到這一點(manuel觸發器),你可以添加另一個計時器。設置它的時間間隔然後寫這個代碼裏面的Tick事件:

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

那偉大工程,非常感謝你。 盧克。 – user3277329

0

是的,你可以使用lambda函數,作爲中提到的例子中使用。 Lambda函數是嵌套函數的一種形式,因爲它們允許訪問包含函數範圍內的變量。 Lambda表達式定義爲:

(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; 
}