Как написать событие типа «Предварительный просмотр», которое может отменить главное событие? - PullRequest
1 голос
/ 10 июня 2009

Допустим, у меня есть событие. Давайте назовем это DoStuff. Прежде чем DoStuff произойдет, я пытаюсь использовать другое событие PreviewDoStuff, чтобы проверить, нужно ли мне предотвращать вызов DoStuff. Проблема, с которой я сталкиваюсь, заключается в том, что я не могу получить какое-либо значение из PreviewDoStuff, например, код возврата или что-либо еще из-за того, как пишутся события. И аргументы событий не передаются вызывающей стороне, поэтому я не могу получить свойство обработанных аргументов событий. Я уверен, что должен быть способ сделать это, но я не уверен, как. Есть идеи?

Спасибо!

Ответы [ 3 ]

5 голосов
/ 10 июня 2009

Объявите событие как EventHandler<CancelEventArgs>. Затем слушатель может установить для Отмена значение true, и вы можете использовать это значение, чтобы определить, вызывать ли «настоящее» событие или нет.

Обязательный пример кода:

public event EventHandler<CancelEventArgs> PreviewDoStuff;
public event EventHandler DoStuff;

private void RaiseDoStuff()
{
    CancelEventArgs args = new CancelEventArgs();
    OnPreviewDoStuff(args);
    if (!args.Cancel)
    {
        OnDoStuff(EventArgs.Empty);
    }
}

protected void OnPreviewDoStuff(CancelEventArgs e)
{
    EventHandler<CancelEventArgs> previewDoStuff = PreviewDoStuff;
    if (previewDoStuff != null)
    {
        previewDoStuff(this, e);
    }
}

protected void OnDoStuff(EventArgs e)
{
    EventHandler doStuff = DoStuff;
    if (doStuff != null)
    {
        doStuff(this, e);
    }
}

В качестве примера такого использования в реальной жизни проверьте событие FormClosing , в котором используется класс FormClosingEventArgs, который, в свою очередь, наследуется от CancelEventArgs.

0 голосов
/ 10 июня 2009

Полагаю, вы имеете в виду, что хотите создать собственное событие с именем DoStuff. Я думаю, что можно передать аргументы "ref":

public delegate void PreviewDoStuffFunc(ref bool Handled);
public event PreviewDoStuffFunc PreviewDoStuff;

Но стандартным способом было бы использовать что-то вроде CancelEventArgs:

public event CancelEventArgs PreviewDoStuff;
public event EventArgs DoStuff;

Затем после запуска события предварительного просмотра вы проверяете Отмена:

var e = new CancelEventArgs();    
if (PreviewDoStuff != null)
    PreviewDoStuff(this, e);
if (!e.Cancel)
    DoStuff(this, EventArgs.Empty);
0 голосов
/ 10 июня 2009

Сделайте так, чтобы ваш PreviewDoStuff установил внутренний флаг, который DoStuff проверяет при запуске. Еще лучше, если код, вызывающий DoStuff, проверит флаг, прежде чем вызовет событие.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...