2016-06-22 5 views
4

私はWindows Formsアプリケーションで作業していますが、何が起こっているのか分かりません。Cでのイベントハンドラの削除#

私はMVCアーキテクチャに類似したものを持っています。場合によっては、ビューに属するコントロールがイベントの受信を停止するようにしたいことがあります。ビューコード内で私はこのようになります方法を書いているので:

public void enableEventHandlers(bool enable) 
{ 
    if (enable) 
    { 
     control.someEvent += someEventHandler; 
    } 
    else 
    { 
     control.someEvent -= someEventHandler; 
    } 
} 

事がある:私は、イベントハンドラを削除したい場合、私はちょうどパラメータとして虚偽でこのメソッドを呼び出します。 私はビューコード内からこのメソッドを呼び出す場合、それは正常に動作します。しかし、コントローラコードの内側からこのメソッドを呼び出すと、それは機能しません(イベントハンドラは削除されません)。

ただ、もう少し文脈与えるために:これは動作します

を:

public partial class View : Form 
{ 
    public void enableEventHandlers(bool enable) 
    { 
     // The code I already showed 
    } 

    public void doSomething() 
    { 
     enableEventHandlers(false); 
     // do something 
     enableEventHandlers(true); 
    } 
} 

このdoens't仕事:

public class controller 
{ 
    private View myView; 

    public void doSomething() 
    { 
     myView.enableEventHandlers(false); 
     // Do something... but somehow everything inside my Form is still paying attention to events 
     myView.enableEventHandlers(true); 
    } 
} 
+0

これはスレッドの問題ではありませんか?すべてのGUIコードはメインスレッドから呼び出す必要があります。あなたのコントローラは別のスレッドにありますか? – AnthonyLambert

+3

あなたのコードは実際にあなたが望むことをしなければならないかのように見えるので、もっと文脈が必要だと思います。問題を再現できるように[mcve](http://stackoverflow.com/help/mcve)を作成できますか? –

+0

また、イベントハンドラが削除しようとする前に実際に登録されていることを確認することもできます。ハンドラを追加する場合も同じです。現在登録されているハンドラがないことを確認してください。また、フォームは部分クラスです。初期化コードがイベントハンドラを登録していないことを確認してください。 WinForms開発者用にDesignerを完全に使用しない方がよいでしょう。 Formをサブクラス化し、コードを自分で記述するクラスを作成するだけです。あなたはあなたの最終製品をはるかにコントロールします。また、あなたのUI設計を考慮する必要があります。このようなハンドラーを削除する必要がある場合は、間違っている可能性があります。 – ManoDestra

答えて

-2

それはそれだ場合、私は知りませんが、あなたはdidnのあなたのビューを初期化しません。あなたはただ「プライベートビュービュー」と言っていますが、それはどこにも指していません。プライベートView v = new View()を使用して新しいViewを作成するか、またはそのビューがイベントを変更するビューをポイントするようにします。

+1

彼は 'NullReferenceException'をキャッチしていたでしょう。 –

0

最後に問題が見つかりました。どういうわけか、同じコントロールにイベントハンドラを2回追加していたようです。とにかくやっていたところで、正確な行番号を見つけることができませんでした。私が見つけた解決策は、新しいイベントハンドラを追加する前にイベントハンドラを削除することです。 だから、メソッドenableEventHandlersは次のように今見える:あなたの答えのための

public void enableEventHandlers(bool enable) { 
    if (enable) 
    { 
     control.someEvent -= someEventHandler; 
     control.someEvent += someEventHandler; 
    } 
    else 
    { 
     control.someEvent -= someEventHandler; 
    } 
} 

感謝を。

関連する問題