4

Compact Framework を使用してスマート デバイス プロジェクトを開発しています。

私はListViewいくつかのチェック可能なListViewItems を持っています: プロパティCheckBoxesは true です。一度に 1 つだけチェックする必要があるため、イベントListViewItemをサブスクライブしました。ItemCheck

// I need to know the last item checked
private ListViewItem lastItemChecked;

private void listView_ItemCheck(object sender, ItemCheckEventArgs e)
{
    if (lastItemChecked != null && lastItemChecked.Checked)
    {
        /* I need to do the following to prevent infinite recursion:
        i.e. subscribe and then unsubscribe the ItemCheck event. */
        listView.ItemCheck -= listView_ItemCheck;
        lastItemChecked.Checked = false;
        listView.ItemCheck += listView_ItemCheck;
    }

    lastItemChecked = listView.Items[e.Index];
}

無限再帰を防ぐより良い方法はありStack Overflowますか?

4

5 に答える 5

12

まあ、EventHandlers をジャグリングするよりも良いことは、lastItemCheck が EventArgs からの現在の項目であるかどうかを確認することだと思います。このような:

// I need to know the last item checked
private ListViewItem lastItemChecked;

private void listView_ItemCheck(object sender, ItemCheckEventArgs e)
{
    // if we have the lastItem set as checked, and it is different
    // item than the one that fired the event, uncheck it
    if (lastItemChecked != null && lastItemChecked.Checked
        && lastItemChecked != listView.Items[e.Index] )
    {
        // uncheck the last item and store the new one
        lastItemChecked.Checked = false;
    }

    // store current item
    lastItemChecked = listView.Items[e.Index];
}

EventHandler を再割り当てすることは、格納されたオブジェクトの参照を単にチェックするよりも少し悪いことに同意していただけると思います。

于 2012-12-13T12:07:29.003 に答える
0
private void listView1_ItemChecked(object sender, ItemCheckedEventArgs e)
    {
        listView1.ItemChecked -= listView1_ItemChecked;
        foreach (var item in listView1.CheckedItems)
        {
            if (e.Item != item)
            {
                ((ListViewItem)item).Checked = false;

            }

        }
        listView1.ItemChecked += listView1_ItemChecked;
    }
于 2014-11-03T21:23:44.627 に答える