2014-02-05 97 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; 
}