私は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);
}
}
これはスレッドの問題ではありませんか?すべてのGUIコードはメインスレッドから呼び出す必要があります。あなたのコントローラは別のスレッドにありますか? – AnthonyLambert
あなたのコードは実際にあなたが望むことをしなければならないかのように見えるので、もっと文脈が必要だと思います。問題を再現できるように[mcve](http://stackoverflow.com/help/mcve)を作成できますか? –
また、イベントハンドラが削除しようとする前に実際に登録されていることを確認することもできます。ハンドラを追加する場合も同じです。現在登録されているハンドラがないことを確認してください。また、フォームは部分クラスです。初期化コードがイベントハンドラを登録していないことを確認してください。 WinForms開発者用にDesignerを完全に使用しない方がよいでしょう。 Formをサブクラス化し、コードを自分で記述するクラスを作成するだけです。あなたはあなたの最終製品をはるかにコントロールします。また、あなたのUI設計を考慮する必要があります。このようなハンドラーを削除する必要がある場合は、間違っている可能性があります。 – ManoDestra