2016-04-30 59 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; 
} 

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

更新:

每@乔恩的评论,这似乎是最简单的给我,我修改了代码如下:

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)有多个事件处理程序,则应考虑想要发生的事情; b)没有事件处理程序。 –

回答

1

常见的做法是将您的价值封装在您的活动期望的类型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

ib11:添加一个代码示例到我的答案:粘贴到一个干净的控制台应用程序编译和运行。 HTH。 –