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

は、イベントハンドラから値を返すために直接的な方法はありますか私は、イベントの結果を格納するために、別の静的フィールドを使用する必要がありますか?

更新:次のように私には最も簡単なように見えたJonのコメント、@パー

、私は、コードを変更:

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

はい。しかし、もしあなたが複数のイベントハンドラがあるならば、あなたは何が起こりたいかを考慮する必要があることに留意してください。 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。 –