2017-01-25 4 views
-1

以下のコードを投稿してください。foo1からプログレスバーを更新します。 私は イベントハンドラを設定するには

class Foo : Form  // implements progressbar 
{ 
    IFoo foo = new Foo1() 

    // this will not do: 
    ProgressBarEventHandler = new EventUpdateProgressBar(this.UpdateProgressBar); 

    UpdateProgressBar() { } 
} 

public delegate void EventUpdateProgressBar(); 
class FooBase 
{ 
    public EventUpdateProgressBar ProgressBarEventHandler; 

    protected virtual void UpdateProgressBar() 
    { 
     if (ProgressBarEventHandler != null) 
      ProgressBarEventHandler(); 
    } 

} 

class Foo1 : IFoo,FooBase { base.UpdateProgressBar() } 
class Foo2 : IFoo,FooBase {} 

interface IFoo {} 

はFoo

でのEventHandlerを実装することができないんだ。この作業を取得する方法はありますかより良い方法はありますか?

+1

正確な問題は何ですか?このコードでは例外がありますか? –

+0

Foo ProgressBarEventHandlerが存在しないため、コンパイルされません。 – aw48

+0

Fooの奇妙な宣言のため、最初はコンパイルされません。 Fooはクラスとして宣言されていますが、メソッドのように本体にコードが含まれています。 EventUpdateProgressBarに来る前に、この問題を修正してください。 –

答えて

0

あなたの意図が何であるかは完全にはわかりませんが、2つのクラスを実装しようとすると、一方がイベントを発生させ、もう一方がそれを処理すると、最小サンプルは次のようになります。イベントの

delegate void MyEvent(); 

class MyEventSource 
{ 
    public event MyEvent Event; 

    public void RaiseEvent() 
    { 
     MyEvent evt = Event; 
     if (evt != null) 
      evt(); 
    } 
} 

class MyEventListener 
{ 
    public void SubscribeForEventFromMyEventSource(MyEventSource eventSource) 
    { 
     eventSource.Event += this.EventHandler; 
    } 

    public void EventHandler() 
    { 
     // Event handling logic here 
    } 
} 

もっと読書はここにあります:https://msdn.microsoft.com/en-us/library/9aackb16(v=vs.110).aspx、ここhttps://codeblog.jonskeet.uk/2015/01/30/clean-event-handlers-invocation-with-c-6/

+0

あなたの答えに感謝します。 a)クラスFooは2つの宣言とメソッドしか含んでいません。私は昨夜解決策を見つけました:public EventUpdateProgressBar ProgressBarEventHandler {get;セット; }それをIFoo宣言リストに追加すればうまくいきます! – aw48

関連する問題