【问题标题】:i have an error when creating an event创建活动时出错
【发布时间】:2011-04-13 13:58:30
【问题描述】:

我有以下几点:

一个游戏类

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)
      {
      }
 }

现在还好吗?或者当我运行它时它会引发一些问题(我想节省自己在后面调试..)

【问题讨论】:

  • 这里的操作符(+=)为你的对象事件添加了一个事件处理方法。

标签: c# .net winforms events event-handling


【解决方案1】:

事件声明:

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

【讨论】:

  • 但是当我添加它时。它告诉我没有重载方法匹配 System.EventHandler ..为什么会这样?
  • 您必须更改您的事件的委托以匹配 Form1_GameOverMethod .. 我相信您需要阅读有关创建事件的信息...
  • 好的.. 我现在修好了。我使用了强制转换,因为我仍然想使用 PlayerAliveEventArgs .. 我在 EventArgs 的代码中进行了转换..
  • @Dmitry:你需要更改event的签名。不是event handler!
  • @Akram:您可以使用@ 指定您要告诉谁:)
【解决方案2】:

你应该使用

game.GameOver += Form1_GameOverMethod;

【讨论】:

    【解决方案3】:

    因为你的方法被命名为Form1_GameOverMethod

    【讨论】:

      【解决方案4】:

      GameOverMethod 在这种情况下确实不存在。然而存在的(我想这就是你想要的)是Form1_GameOverMethod

      还有几句话。首先,在触发事件之前,您应该检查是否有人订阅了它。

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

      其次,我认为您应该将事件声明更改为:

      public event EventHandler<PlayerAliveEventArgs> GameOver;
      

      希望对你有帮助

      【讨论】:

      • 太棒了,我不知道......但我不需要考虑你的第一个事件,因为订阅会在表单加载后立即发生。 game.GameOver+=Form1_GameOverMethod 在 Form1_Load 事件处理程序中
      • 在这种特殊情况下可能是这样,但您应该采取这些预防措施以避免在其他情况下出现奇怪的异常。
      猜你喜欢
      • 1970-01-01
      • 2015-02-06
      • 2021-11-25
      • 2021-01-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多