#c# #.net #winforms #events #event-handling
#c# #.net #winforms #Мероприятия #обработка событий
Вопрос:
у меня есть следующее:
игровой класс
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)
{
}
}
теперь все в порядке? или при его запуске возникнут какие-то проблемы (я хочу сэкономить на отладке последнего ..)
Комментарии:
1. Оператор ( =) здесь добавляет метод обработчика событий к вашему объекту event.
Ответ №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(..));
}
Комментарии:
1. но когда я добавляю его. это говорит мне об отсутствии перегрузки для метода matches System. Обработчик событий.. почему это?
2. Вы должны изменить делегат вашего события, чтобы он соответствовал Form1_GameOverMethod .. Я полагаю, вам нужно прочитать о создании событий…
3. хорошо .. сейчас я это исправил. я использовал приведение, потому что я все еще хочу использовать PlayerAliveEventArgs.. я привел это в коде из EventArgs..
4. @Dmitry: Вам нужно изменить подпись
event
. не изevent handler
!5. @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;
Надеюсь, это поможет
Комментарии:
1. потрясающе, я этого не знал .. но мне не нужно учитывать ваше первое событие, потому что подписка происходит, как только форма загружается сама. игра. GameOver =Form1_GameOverMethod находится внутри обработчика событий Form1_Load
2. это может быть правдой в данном конкретном случае, но вы должны принять эти меры предосторожности, чтобы избежать странных исключений в других сценариях.