2011-12-05 3 views
1

CheckedChangedイベント(または他のC#イベント)がユーザーイベントとして宣言される方法はありますか?問題は、プロパティCheckedがコードによって変更された場合、イベントが呼び出され、これは望ましくないことです(たとえば、イベントはプロパティイベントではなくユーザーイベントです)。私はブール値のフラグを渡して、これは2011年にちょっと厄介です!ユーザーイベント - たとえばチェックボックス

+2

変更が発生した場所に気を付けると、何か間違っている大きなチャンスがあります。チェックボックスがコードから設定されているのはなぜ重要ですか? – Jon

+0

@ジョン - あなたは非常に良い点を持っています。まれに、イベントがユーザ生成であるのか、コード生成で生成されたのかを抽象化する必要があるかどうかを知ることは有益ですが、 –

+0

@Jonそれは役に立つと思うケースがいくつかあります。たとえば、ユーザーがボックスをチェックしたときにログに書き込む場合、またはユーザーがチェックボックスをオンにしたときにメッセージボックスを表示する場合は、コードから呼び出したときにメッセージボックスを表示する必要がある場合。確かに、別のレイヤーのような基になる変数を追加して、それをより良くサポートするアーキテクチャを得ることができますが、単純な例外をオーバーエンジニアリングするのでしょうか? – DonkeyMaster

答えて

2

イベントの登録を解除することができます。値を変更した後、再度購読することができます。

this.checkBox1.CheckedChanged -= new EventHandler(checkBox1_CheckedChanged); 
this.checkBox1.Checked = true; // will not firing the CheckedChanged event 
this.checkBox1.CheckedChanged += new EventHandler(checkBox1_CheckedChanged); 

alternativlyあなたはこのことができます

希望に動作します。この

bool isUser = true; 

public Form1() 
{ 
    InitializeComponent(); 

    isUser = false; 
    this.checkBox1.Checked = true; 
    isUser = true; 
} 

void checkBox1_CheckedChanged(object sender, EventArgs e) 
{ 
    if (!isUser) // check if the change has fired by user 
     return; 

    // ... 
} 

両方のように迂回するように変数を設定することができます。

+0

それは有望なようです、私はそれを見ていただきありがとうございます。これは、私が行ったことでした。 1つのイベントが他のイベントとやりとりするので、購読の解除はより明確ですが、逆に進むと混乱します。 – Sunscreen

+0

お手伝いができたらうれしいです。 – dknaack

+0

'this.checkBox1.CheckedChanged - = new EventHandler(checkBox1_CheckedChanged);と書くのは大変だと思います。'新しいEventHandler(checkBox1_CheckedChanged) 'ではないのですか? yesの場合、その新しいオブジェクトは既に 'CheckedChanged'コレクションに存在することはできません。私はすぐにあなたの言葉を信じますが、このコードはあなたがそれを暗示しているように機能します。 – DonkeyMaster

1

C#は "ユーザーイベント"をサポートしていません。キーワードイベントを使用して指定された1つのタイプのイベントのみをサポートしています(基本的にはによって制御されたの委任参照)。 C#がイベントをどのように処理するかについてもう少し詳しく知りたい場合はJon Skeet's excellent treatment of the subject hereをご覧ください。

今、あなたが比較しているのは、本当にリンゴにリンゴではありません。 MFCはフレームワークです。 C#は言語です。だから、フレームワークのところでは、それはフレームワークに依存します。あなたの例では、WinFormsを参照しているようです。それがそうだとすれば、答えは残念ながら「いいえ」です:WinFormsは、あなたが記述したように「ユーザイベント」をサポートしていません。

関連する問題