Visual C#从事件处理程序返回值

时间:2016-04-30 17:44:28

标签: c# event-handling return

我有一个表单,其中包含一个按钮,用于获取在另一个类中执行的方法。

表格上的代码:

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;
}

是否有任何直接的方法从事件处理程序返回值,或者我需要使用单独的静态字段来存储事件结果?

更新

Per @ Jon的评论,对我来说似乎最简单,我在下面添加了一个答案,展示了最简单的方法。

2 个答案:

答案 0 :(得分:2)

通常的做法是将您的值封装在您的事件所期望的EventArgs类型中。例如,框架的CancelEventArgs包含一个可设置的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 :(得分:0)

在我看来,每一个Jon Skeet的评论似乎最简单,最简单的方法似乎如下:

public delegate bool CustomPreviewCreate(); // here we declare a return type
public static event CustomPreviewCreate CustomPreviewCreate_Do;

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

然后:

// the method is declared to return the same type
bool SubAsstViewPartControl_CustomPreviewCreate_Do()  
{
    // do stuff
    return true;  // return the value of the type declared
}