4

以下のコードを見てください。Listview ItemSelectionChanged イベントが 2 回発生するため、UserClosedSession ダイアログが 2 回表示されます。2番目のダイアログを抑制する方法はありますか?

基本的に、ユーザーがリストビューの項目をクリックしたときに、いくつかの検証を行おうとしています。選択したアイテムを変更すると、質問が表示されます。「はい」の場合は新しいアイテムを選択し、「いいえ」の場合は選択を「元に戻します」。以下のコードは、実際の問題の単純なサンプルです。UserClosedSession の内容は無視してください。ここでは、発生する必要があることを模倣するために使用されています。

私はあらゆる種類を試しました。マウスクリック/マウスダウンイベントを試しました。しかし、ユーザーがキーボードで選択を変更する場合、これらは役に立ちません。私はまた、配線を外してから、ItemSelectionChangedeventを自分自身から再配線しようとしました(コメントアウトされたコードを参照)-機能しません。

    private void lv_ItemSelectionChanged(object sender, ListViewItemSelectionChangedEventArgs e)
    {
        if (e.IsSelected)
        {
            Debug.WriteLine("Index: " + lv.SelectedIndices[0].ToString());
            if (lv.Tag != null)
            {
                if ((int)lv.Tag != lv.SelectedIndices[0])
                {

                    if (!UserClosedSession())
                    {
                        //lv.ItemSelectionChanged -= new ListViewItemSelectionChangedEventHandler(lv_ItemSelectionChanged);
                        //lv.ItemSelectionChanged -= lv_ItemSelectionChanged;
                        lv.Items[(int)lv.Tag].Selected = true;
                        //lv.ItemSelectionChanged +=new ListViewItemSelectionChangedEventHandler(lv_ItemSelectionChanged);
                        return;
                    }
                }
            }
            else
                lv.Tag = lv.SelectedIndices[0];
        }
    }


    private bool UserClosedSession()
    {
        return
            (MessageBox.Show("Close Session?", "", MessageBoxButtons.YesNo) == DialogResult.Yes);
    }
4

1 に答える 1

0

私は以前にこのようなものを使用したことがありますが、うまくいきました。おそらく、この状況でも同様です。私がしているのは、このイベントが処理されたかどうかを示す値を保持するブール フィールドを設定することだけです。処理されていない場合、メソッドが実行され、handled フィールドが true に設定されます。次回は、これが処理されたことがわかります。メソッド全体を実行して、handled フィールドを false に戻すのではありません。これは、イベントが 2 回連続して発生し、最初のイベント発生のみを処理したい場合にのみ行われます。2 番目のイベント ファイアが必要な場合は、私がお手伝いします。このイベントが 2 回以上連続して発生する場合はお知らせください。おそらくその問題の解決策も見つけられるでしょう。

bool eventHandled = false;
private void lv_ItemSelectionChanged(object sender, ListViewItemSelectionChangedEventArgs e)
{
    if (!eventHandled)
    {
        eventHandled = true;
        if (e.IsSelected)
        {
            Debug.WriteLine("Index: " + lv.SelectedIndices[0].ToString());
            if (lv.Tag != null)
            {
                if ((int)lv.Tag != lv.SelectedIndices[0])
                {
                    if (!UserClosedSession())
                    {
                        //lv.ItemSelectionChanged -= new ListViewItemSelectionChangedEventHandler(lv_ItemSelectionChanged);
                        //lv.ItemSelectionChanged -= lv_ItemSelectionChanged;
                        lv.Items[(int)lv.Tag].Selected = true;
                        //lv.ItemSelectionChanged +=new ListViewItemSelectionChangedEventHandler(lv_ItemSelectionChanged);
                        return;
                    }
                }
            }
            else
                lv.Tag = lv.SelectedIndices[0];
        }
    }
    else
        eventHandled = false;
}
于 2013-02-15T17:33:04.873 に答える