14

CheckChangedいくつかのチェック ボックスがある小さなフォームがあり、イベントのチェック ボックスごとにメッセージ ハンドラーがあります。一部のチェック ボックスは他のチェック ボックスに依存しているため、1 つのチェック ボックスのチェック状態が変化すると、依存するチェック ボックスのチェック状態も変化します。これにより、他のチェックボックスでイベントが発生することがわかりましたが、私の問題は、イベントが実際にチェックボックスをクリックしたユーザーから発生した場合にのみ呼び出す必要がある関数呼び出しが各イベントに 1 つあることです。イベントがマウス クリックによって発生したかどうかを (おそらく送信者または からEventArgs) 判断する方法を知りたいです。CheckChanged

崖:

  • 複数のチェックボックス受信CheckChangedイベント
  • イベントがマウスクリックによって発生したかどうかを判断する必要があります
4

2 に答える 2

5

フラグを使用して、イベントを無視するかどうかを示すことができます。イベント ハンドラーからサブスクライブを解除するよりもおそらく簡単です。あまり洗練されていませんが、仕事をする必要があります。

簡単な例をまとめました:

   bool ignoreEvents = false;
        public Form1()
        {
            InitializeComponent();
        }

        private void checkBox1_CheckedChanged(object sender, EventArgs e)
        {
            ignoreEvents = true;
            checkBox2.Checked = checkBox1.Checked ;
            checkBox3.Checked = checkBox1.Checked;
            ignoreEvents = false;
        }

        private void checkBox2_CheckedChanged(object sender, EventArgs e)
        {
            if (ignoreEvents) return;
            MessageBox.Show("Changed in 2");
        }

        private void checkBox3_CheckedChanged(object sender, EventArgs e)
        {
            if (ignoreEvents) return;
            MessageBox.Show("Changed in 3");
        }
于 2013-03-21T14:24:26.390 に答える
0

コードの安定性を高めるために、ignoreEvents フラグの代わりにクラス TriggerLock を使用することもできます。

    private void checkBox1_CheckedChanged(object sender, EventArgs e)
    {
        using (new TriggerLock())
        {
            checkBox2.Checked = checkBox1.Checked;
            checkBox3.Checked = checkBox1.Checked;
        }
    }

    private void checkBox2_CheckedChanged(object sender, EventArgs e)
    {
        if (TriggerLock.IsOpened)
        {
            MessageBox.Show("Changed in 2");
        }
    }

    private void checkBox3_CheckedChanged(object sender, EventArgs e)
    {
        if (TriggerLock.IsOpened)
        {
            MessageBox.Show("Changed in 3");
        }
    }

クラス TriggerLock は、セマフォのように機能します。

public class TriggerLock
    : IDisposable
{
    private static int _nUsing = 0;
    private bool _bDisposed;

    public TriggerLock()
    {
        _bDisposed = false;
        Interlocked.Increment(ref _nUsing);
    }
    ~TriggerLock()
    {
        Dispose(false);
    }

    public static bool IsOpened 
    {
        get { return _nUsing == 0; }
    }

    public void Dispose()
    {
        Dispose(true);
    }
    private void Dispose(bool bDisposing)
    {
        if (bDisposing && !_bDisposed)
        {
            Interlocked.Decrement(ref _nUsing);
            _bDisposed = true;
        }
    }
}
于 2014-06-04T07:03:13.253 に答える