2016-04-30 4 views
0

У меня есть форма, которая имеет кнопку, чтобы получить метод, выполненный в другом классе.Visual C# возвращающее значение из обработчика события

код на форме:

public delegate void CustomPreviewCreate(); 
public static event CustomPreviewCreate CustomPreviewCreate_Do; 

private void CreatePreview() 
{ 
    if (CustomPreviewCreate_Do !=null) 
    { 
     CustomPreviewCreate_Do(); 
    } 
} 

Это событие затем получает обрабатывается в другом классе. То, что я хотел бы достичь, - это то, что я могу вернуть форму в виде формы возвращаемого значения, если метод правильно выполнен.

То, что я пробовал до сих пор, не дает мне результата.

Вот код:

public void Initialize() 
{ 
    SubAsstViewPartControl.CustomPreviewCreate_Do += SubAsstViewPartControl_CustomPreviewCreate_Do; 
    // this gives me a the compiler error that the return type is wrong 
} 

private bool SubAsstViewPartControl_CustomPreviewCreate_Do() 
{ 
    // do stuff 
    return false; 
} 

Есть ли прямой способ возврата значения из обработчика событий или мне нужно использовать отдельное статическое поле для хранения результата событий в?

Update:

Per @ комментарий Джона, который казался самым простым для меня, я изменил код следующим образом:

public delegate bool CustomPreviewCreate(); 
public static event CustomPreviewCreate CustomPreviewCreate_Do; 

private void CreatePreview() 
{ 
    if (CustomPreviewCreate_Do !=null) 
    { 
     bool returnval = CustomPreviewCreate_Do(); 
    } 
} 

И потом:

bool SubAsstViewPartControl_CustomPreviewCreate_Do() 
{ 
    // do stuff 
    return true; 
} 

Подскажите пожалуйста если это приемлемый подход, когда я хочу просто возвращать логические значения?

+1

Ну вы * можете * вернуть значение из обработчика событий, но только если тип делегата объявляется возвращать значение ... –

+0

Это означает, что мне нужно изменить код моего делегата от 'void' до' bool' например? – ib11

+1

Да. Но имейте в виду, что вы должны подумать о том, что вы хотите, если: a) есть несколько обработчиков событий; б) нет обработчиков событий. –

ответ

1

Общий подход заключается в том, чтобы инкапсулировать ваше значение в тип EventArgs, который ожидает ваше событие. Например, в базе данных CancelEventArgs Framework содержится устанавливаемое свойство bool Cancel, позволяющее каждому CancelEventHandler присвоить значение. Затем отправитель может прочитать свойство после вызова события. Вы можете также использовать контейнерный класс EventArgs, если вы хотите собирать отдельные значения из отдельных обработчиков событий. Например:

using System; 
using System.Collections.Generic; 

namespace ConsoleApplication1 
{ 
    public class SingleValueEventArgs : EventArgs 
    { 
    public int Value { get; set; } 
    } 

    public class MultiValueEventArgs : EventArgs 
    { 
    private List<int> _values = new List<int>(); // Private to prevent handlers from messing with each others' values 

    public IEnumerable<int> Values 
    { 
     get { return _values; } 
    } 

    public void AddValue(int value) { _values.Add(value); } 
    } 

    public class Exposer 
    { 
    public event EventHandler<SingleValueEventArgs> WantSingleValue; 
    public event EventHandler<MultiValueEventArgs> WantMultipleValues; 

    public void Run() 
    { 
     if (WantSingleValue != null) 
     { 
     var args = new SingleValueEventArgs(); 
     WantSingleValue(this, args); 
     Console.WriteLine("Last handler produced " + args.Value.ToString()); 
     } 

     if (WantMultipleValues != null) 
     { 
     var args = new MultiValueEventArgs(); 
     WantMultipleValues(this, args); 
     foreach (var value in args.Values) 
     { 
      Console.WriteLine("A handler produced " + value.ToString()); 
     } 
     } 
    } 
    } 

    public class Handler 
    { 
    private int _value; 

    public Handler(Exposer exposer, int value) 
    { 
     _value = value; 
     exposer.WantSingleValue += exposer_WantSingleValue; 
     exposer.WantMultipleValues += exposer_WantMultipleValues; 
    } 

    void exposer_WantSingleValue(object sender, SingleValueEventArgs e) 
    { 
     Console.WriteLine("Handler assigning " + _value.ToString()); 
     e.Value = _value; 
    } 

    void exposer_WantMultipleValues(object sender, MultiValueEventArgs e) 
    { 
     Console.WriteLine("Handler adding " + _value.ToString()); 
     e.AddValue(_value); 
    } 
    } 

    class Program 
    { 
    static void Main(string[] args) 
    { 
     var exposer = new Exposer(); 

     for (var i = 0; i < 5; i++) 
     { 
     new Handler(exposer, i); 
     } 

     exposer.Run(); 
    } 
    } 
} 
+1

ib11: добавлен образец кода в мой ответ: вставьте в чистое консольное приложение для компиляции и запуска , НТН. –

Смежные вопросы