2011-04-13 73 views
0

时具有误差我有以下:我创建事件

游戏类

class Game 
{ 
    public event EventHandler GameOver; 

    public void go() 
    { 
     PlayerAliveEventArgs playerAlive = new PlayerAliveEventArgs(Alive); 
     GameOver(this, playerAlive); 
    } 
} 

然后我在另一个类的类

public class PlayerAliveEventArgs : EventArgs 
{ 
    public bool Alive { get; set; } 

    public PlayerAliveEventArgs(bool deadOrAlive) 
    { 
     Alive = deadOrAlive; 
    } 
} 

我扎的方法来该事件...

public void Form_Load() 
{ 
    game.GameOver += Form1_GameOverMethod; // it shows the error here. 
    it says no overload of this method matches System.Eventhandler 
} 

public void Form1_GameOverMethod(object sender, PlayerAliveEventArgs e) 
{ 
    if (!e.Alive) 
    { 
     GameTimer.Enabled = false; 
     gameOver = true; 
     Refresh(); 
    } 
} 

该错误是:

方法在此上下文中不存在。

这是为什么?

好吧,我做了以下修改:

public void Form1_GameOverMethod(object sender, EventArgs e) 
{ 
     PlayerAliveEventArgs d = (PlayerAliveEventArgs)e; 
     if (!d.Alive) 
     { 
     } 
} 

是它现在没事了?还是会解雇一些问题,当我运行它(我想拯救自己的调试后..)

+0

操作(+ =)这里增加了一个事件处理方法到对象的事件。 – 2011-04-13 14:03:48

回答

0

GameOverMethod实际上并不存在。然而,存在什么(并且这是你想要的我想)是Form1_GameOverMethod

还有一些言论。首先,在发起活动之前,您应该检查是否有人订阅了该活动。

if(GameOver!=null) 
    GameOver(this, new PlayerAliveEventArgs(Alive)); 

第二,我相信你应该改变你的事件声明是:

public event EventHandler<PlayerAliveEventArgs> GameOver; 

希望这有助于

+0

真棒,我didnt知道..但我不需要考虑你的第一个事件,导致订阅发生尽快当表单加载自己。 game.GameOver + = Form1_GameOverMethod位于Form1_Load事件处理程序 – 2011-04-13 14:15:44

+0

内部,在这种情况下可能为true,但您应该采取这些预防措施以避免在其他情况下出现奇怪的例外。 – AbdouMoumen 2011-04-13 14:27:33

4

事件声明:

public event EventHandler<PlayerAliveEventArgs> GameOver; 

订阅:

game.GameOver += Form1_GameOverMethod; 

事件处理程序:

private void Form1_GameOverMethod(object sender, PlayerAliveEventArgs e) 
{ 
    bool alive = e.Alive; 
} 

发射:

if (this.GameOver != null) // does any subscriber exist? 
{ 
    this.GameOver(this, new new PlayerAliveEventArgs(..)); 
} 
+0

但是当我添加它。它告诉我没有重载方法匹配System.EventHandler ..为什么? – 2011-04-13 14:02:57

+0

@Dmitry:我更新了我的答案 – abatishchev 2011-04-13 14:05:56

+0

您必须更改您的活动的代表以匹配Form1_GameOverMethod ..我相信您需要阅读有关创建活动的信息... – 2011-04-13 14:06:09

1

您应该使用

game.GameOver += Form1_GameOverMethod; 
1

因为你的方法被命名为Form1_GameOverMethod