2016-04-30 94 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。 –